簡體   English   中英

使用malloc時串聯字符串長度的差異

[英]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終止符。

如果更改為使用strcpystrcat則將獲得一致的結果

strcpy(c, a); 
strcat(c, b);

使用calloc將c的元素初始化為0。否則,在第一次調用strcat之前,它將保持單位化,並且結果是不確定的。 像您一樣使用未初始化的變量會調用未定義的行為,這永遠都不好。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM