2014-02-13 6 views
2

저는 초보 프로그래머이며 여기에서 제 문제에 대한 조언을 감사드립니다.참조에 의한 C 문자열

나는 버퍼에있는 문자열을 가져 와서 첫 번째 2 ";"로 구분하여 세 개의 덩어리로 구문 분석하는 절차를 만들었습니다.

내가 시도한 것은 3 개의 char 포인터를 전달하여 구문 분석 된 문자열을 저장할 위치입니다. 하지만 호출 함수에서 얻은 것은 메모리 쓰레기입니다. 내가 도대체 ​​뭘 잘못하고있는 겁니까?

void parseomensaje(char buf[256], char **idNodo, char **idMensaje, char **mensaje){ 

    char *temp; 
    temp=(char *)malloc(sizeof(buf)); 


    strcpy(temp, buf); 
    printf("\ntemp adentro de la funcion = %s\n", temp); 
    idNodo = strtok (temp,";"); 
    idMensaje = strtok (NULL, ";"); 
    mensaje = strtok (NULL, "\0"); 

    printf("\nADENTRO\nidNodo: %s\nidMensaje: %s\nmensaje: %s", idNodo, idMensaje, mensaje); 

} 

이 기능은이 방법으로 호출됩니다 parseomensaje 실행 버퍼가 원래의 문자열 만 idmen, idnod를 포함하고 남자는 비어 있습니다

 char *idnod=NULL; 
    char *idmen=NULL; 
    char *men=NULL; 

    idnod=(char *)malloc(sizeof(buffer)); 
    idmen=(char *)malloc(sizeof(buffer)); 
    men=(char *)malloc(sizeof(buffer)); 

    parseomensaje (buffer, &idmen, &idnod, &men); 

후.

자습서에서 포인터 이름 자체는 포인터이므로 포인터는 참조로 매개 변수를 전달하는 것과 같지만 포인터의 포인터에 포인터 주소를 전달해야하는 문자열의 경우 ... I was reading it from here하지만 아직 해결하려고합니다.

필자 : 영어로 사과 드리며, 필자의 글을 실수로 지적하십시오. :)

+0

문제의 해결책은 아니지만 'malloc'에 의해 반환 된 포인터를 캐스팅하지 마십시오 – Michael

+0

버퍼의 크기는 얼마입니까? –

답변

3

이 잘못된 : 배열 함수 내의 char*로 저하한다

char *temp; 
temp=(char *)malloc(sizeof(buf)); 

함에 따라, 전용 sizeof(char*) 바이트 (또는 일반적 48 바이트)가 할당되고있다. 실제로 buf의 길이가 4 또는 8 바이트보다 큰 경우 strcpy()이 배열 경계를 넘어서 쓰면 프로그램에 정의되지 않은 동작이 발생합니다. 당신이 경우에 당신이 말한대로 난 당신이 언어에 더 편안 때까지 동적 메모리 할당을 피하는 것이 좋습니다 초보 프로그래머는,

void parseomensaje(char* buf, char **idNodo, char **idMensaje, char **mensaje){ 

: 기본적으로 :

void parseomensaje(char buf[256], char **idNodo, char **idMensaje, char **mensaje){ 

은 동일합니다. 동적으로 할당 된 메모리 대신 고정 크기의 배열을 사용하도록 프로그램을 수정하십시오. 일단 작업을하고 완전히 이해하면 동적으로 할당 된 메모리를 사용하십시오.

+0

답장을 보내 주셔서 감사합니다. 실제로 malloc을 사용하는 것은 부당 합니다만, 그 문장에 대해 언급하면 ​​SegFault 오류가 발생합니다. 하지만 나는 완전히 책임이 있다고 확신한다. – Zeke

+0

@ user3306636, 만약 당신이'malloc'을 주석 처리하지 않았다면,'temp'는 unitialized 포인터이다. 복사하려면 메모리가 필요합니다 :'char temp [256];'예를 들어. – hmjd

0

먼저 프로그램에서 여러 메모리 누수가 발생했습니다. 더 이상 필요하지 않으면 malloc 덕분에 할당 한 모든 메모리 덩어리를 해제 할 수 있습니다.

으로

은 함수를 생각 :

void parseomensaje(char buf[256], char **idNodo, char **idMensaje, char **mensaje) 

왜 당신은 당신의 기능에 char** 포인터를 전달합니까? 대신 char*을 전달하십시오.

char *strtok(char *str, const char *delim); 

는 또한, 당신은 strtok에, 당신의 자신의 기억에없는 새로운 할당 한 포인터를 반환 이후 parseomensaje를 호출하기 전에 메모리를 할당 할 필요가 없습니다 strtok은 이런 식으로 선언되어 있기 때문에.

+0

'char **'는 함수에 전달되므로 호출자는 (strlpy()를 사용하여) 인자를 채우지 않는 한 변경 사항을 볼 수 있습니다. – hmjd

+0

@hmjd 그런 경우 사용자 할당을 호출하기 전에 할당 된 메모리를 수행하지 않아야합니다. –

+0

맞습니다. 나는 OP가 실수로'='가 문자열을 복사한다고 생각합니다. – hmjd

관련 문제