簡體   English   中英

在C中使用malloc和buffer的字符串的指針數組

[英]pointer array with strings using malloc and buffer in C

我被困在如何使用malloc用字符串填充指針數組。 在調試中,我看到當我用字符串填充數組的第一個指針時,當它即將轉到數組中的下一個指針時,它將在第一個和第二個元素中傳遞下一個字符串...好像當我使用ptr[i]=buff; ptr持續顯示在buff數組中。

    #include<stdlib.h>
    #include<string.h>
    #define size 2       //array of 2 pointers
    int main()
{
    int i;
    char *ptr[size];
    char buff[80];

    for (i=0;i<size;i++)
    {
        memset(buff, 0, sizeof(char) * 80);
        printf("Enter name:\n");fflush(stdout);
        scanf("%s",buff);

        ptr[i]=(char*)malloc(strlen(buff));
        //ptr[i]=buff;                        //that was the mistake
        strncpy(ptr[i], buff, strlen(buff));    //->correct answer!
        printf("length %d\n",strlen(buff));
    }
    for (i=0;i<size;i++)
    {
        printf("prt[%d]=%s\n",i,ptr[i]);fflush(stdout);
    }
    for (i=0;i<size;i++)
    {
        free(ptr[i]);
    }
    return 0;
}

總的來說,我必須與數組的長度有關的另一個奇怪的問題。 例如,當聲明數組a[10] ,指針a指向數組的第一個元素。 我不明白的是長度存儲在哪里! 它是指針a的前一個存儲地址嗎? 是以前嗎 還是只與編譯器有關? 謝謝。 我希望這不是我問的太多。 :)

這個:

ptr[i]=buff;

不復制字符串。 它只是復制一個指針。 因此,不會造成內存泄漏(您無法訪問剛剛分配的內存),但是會弄亂您的程序,因為ptr[i]現在指向buff ,因此每次讀取新字符串時,它將似乎影響ptr[]所有元素。

改為這樣做:

strncpy(ptr[i], buff, BUF_SIZE);

另請注意,使用gets認為是不好的做法。 考慮如果用戶鍵入超過9個字符的字符串會發生什么情況。

以下是不正確的:

ptr[i]=buff

您應該使用strcpy()代替分配。

否則,您將相同的指針分配給ptr所有元素,泄漏malloc() ed內存,並嘗試free() malloc()尚未使用的內容malloc()

暫無
暫無

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

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