[英]Difference in concatenated string length when using malloc
為了測試一些代碼,我用C語言編寫了以下程序:
int main(int argc, char *argv[])
{
char *a = "hello ";
char *b = "there";
char *c = malloc(100);
strcat(c, a);
strcat(c, b);
printf("length of a is %d\n", strlen(a));
printf("length of concatenated string is %d\n", strlen(c));
return 0;
}
輸出為:
length of a is 6
length of concatenated string is 11
現在,我沒有執行malloc,而是執行了以下操作(其余代碼相同):
char c[100];
輸出更改為:
length of a is 6
length of concatenated string is 12
我不明白為什么在char數組上使用指針會更改級聯字符串的大小。
由於調用malloc
之后沒有在c
放入任何內容,因此strcat
的調用會導致未定義的行為,因為分配的內存塊可能根本不包含空終止符。 在這種情況下, strcat
在搜索終止符期間將最終訪問超出分配的塊的內存。
這應該使調用保持一致:
char *c = malloc(100);
*c = '\0';
兩個示例中的行為均未定義。 strcat在源字符串中的終止nul之后追加數據。 c
未初始化,因此未定義在哪里(如果有)有nul終止符。
如果更改為使用strcpy
和strcat
則將獲得一致的結果
strcpy(c, a);
strcat(c, b);
使用calloc將c的元素初始化為0。否則,在第一次調用strcat之前,它將保持單位化,並且結果是不確定的。 像您一樣使用未初始化的變量會調用未定義的行為,這永遠都不好。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.