2014-02-23 3 views
0

다음 코드는 힙에 문자열을 선언하고 할당하는 코드입니다. c에서 malloc 문자열에 0을 할당해야합니까?

char *string = malloc(10); 
string[9] = '\0'; 
strncpy(string, "welcometotherealworld", 9); 

printf("string: %s\n", string); 

내가 수동으로 문자열의 끝을 확인하기 위해 \0\을 설정해야합니까? string[9] = '\0';

아니면 strncpy이 작업을 수행합니까?

+0

사용은 calloc (10,는 sizeof (문자)); 확인하기. –

답변

2

strncpy 원본 문자열의 길이 (두 번째 인수)가 세 번째 인수의 값보다 크거나 같으면 대상 배열을 종료하지 않습니다. 그래서 여기

:

strncpy(string, "welcometotherealworld", 9); 

strncpy가 null 종료하지 않습니다.

0

문자는 확실히 9 문자보다 길기 때문에 strncpy은 암시 적으로 종료 문자를 추가해서는 안됩니다.

3

두 가지 : 우선 malloc(10)은 10 바이트를 예약하고, string[10]은 11 번째 바이트를 주소 지정하므로 불법입니다. 둘째 : 예. standard에 따르면 strncpy가 소스 문자열이 count보다 긴 경우 문자열이 null로 끝나지 않도록 보장하기 때문에 string [9]을 null로 설정해야합니다.

0

strncpy(dest, source, n)source을 가리키는 버퍼에서 n 바이트를 버퍼 포인터로 까지 복사합니다. 그러나 strlen(source)n보다 큰 경우 strncpy은 첫 번째 n 바이트를 복사하고 공백이 없으므로 dest 문자열을 null 바이트로 종료하지 않습니다. 따라서 버퍼 source이 항상 null로 종료되도록하려면 직접해야합니다. 당신이하고있는 일은 항상 버퍼가 가리키는 버퍼를 string null로 끝내게 할 것입니다.

0

올바른 '\0'을 보장하려면 코드를 '\0'으로 설정해야합니다.
malloc()string의 데이터를 초기화하지 않습니다.

char *string = malloc(10); 
strncpy(string, "welcometotherealworld", 9 /* or 10 */); 
string[9] = '\0'; 

strncpy(char *s1, const char *s2, size_t n)s1nchar를 기록합니다.
먼저 min(n, strlen(s2))char부터 s2까지입니다.
더 필요한 경우 s2의 나머지는 null 문자로 작성됩니다.

0

strcpy은 항상 \0으로 대상 문자열을 종료합니다. strncpy일반적으로NULL은 문자열을 종료하지만 수행하지 않을 수 있습니다. 문자열의 최대 바이트 수 (n)를 복사하지만 불행하게도 (유용한 ABI의 관점에서) 복사 할 바이트 수 (즉, 종료 문자열을 포함하는 소스 문자열의 길이가 NULL 인 경우 NULL로 복사되지 않습니다.)가 지정된 길이 (n)를 초과합니다.따라서 문자열 "1234567890" (10 자, 11)을 복사하고 strncpy의 마지막 인수로 10을 전달하면 끝나지 않은 10 자 문자열이 표시됩니다. 여기

이 주위에 몇 가지 안전 루트입니다

dest = malloc(10); /* allocate ten bytes */ 
strncpy (dest, src, 10); /* copy up to 10 bytes */ 
dest[9] = 0; /* overwrite the 10th byte with a zero if it was not one already */ 

dest = malloc(10); /* allocate ten bytes */ 
strncpy (dest, src, 9); /* copy up to 9 bytes */ 
dest[9] = 0; /* make the 10th byte zero */ 

dest = calloc(10, 1); /* allocate and zero ten bytes */ 
strncpy (dest, src, 9); /* copy up to 9 bytes, leaving the NULL in */