2017-12-12 16 views
-1

어떤 이유로 strArr [n]의 malloc을 사용하면 strArr [n-1]의 값에 '!'가 추가됩니다. 아니면 마지막 문자를 '!'로 바꿉니다. GDB에서 strArr [n]에 할당 할 때 문자열은 찾은 것처럼 보이지만 n이 증가 할 때 strArr [n] (이 경우 n + 1)을 malloc 할 때 strArr [n-1]은 '!' 덧붙였다. 왜 이런 일이 일어나는지 전혀 모른다.문자열 배열의 마지막 값 끝에 느낌표가 나타납니다. C

char** stringArr = malloc(sizeof(char*)*28); 
char* token; 

int n = 0; 
while(n < 28) 
{ 
    token = //tokenize something here 
    stringArr[n] = malloc(sizeof(token)+1); 
    strcpy(stringArr[n], token); 
} 

답변

2
stringArr[n] = malloc(sizeof(token)+1); 

는이 작업을하지 않습니다. 포인터의 sizeof이 고정되어 있기 때문에 (시스템의 경우). 따라서 토큰 화 된 각 문자열 (할당 한 길이보다 더 길 수도 있음)을 복사하기 위해 고정 길이 문자열을 할당하고 있습니다. 따라서 strcpy은 할당되지 않은 메모리에 액세스하고 있습니다. 이것은 정의되지 않은 동작입니다.

이 복사 할 (NUL은 문자 배열을 종료)

stringArr[n] = malloc(strlen(token)+1); 

지금 당신이 확실 동적으로 할당 된 메모리는 문자열을 유지할 수있는 길이가 만들고있는 것입니다.

또 다른 것은 malloc의 반환 값을 확인하십시오. malloc이 실패 할 경우 정의되지 않은 동작으로 실행되지 않습니다. 작업을 마쳤 으면 동적으로 할당 된 메모리를 해제하십시오.

+1

와우, 내가 그랬다는 것을 믿을 수 없다. 그것은 내 시스템 수업에서 학기의 끝이고 나는 여전히 약간의 실수를 만회하고있다 : ( – codemonkey