[英]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.