带有字符串的指针数组,在C中使用malloc和buffer

时间:2012-01-10 16:03:33

标签: c string pointers arrays

我陷入了如何使用malloc用字符串填充指针数组的问题。在调试中我看到当我用字符串填充数组的第一个指针时,当它即将转到数组中的下一个指针时,它传递第一个和第二个元素中的下一个字符串...好像当我使用{{1 ptr一直显示在buff数组中。

ptr[i]=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指向数组的第一个元素。我不明白的是存储长度的地方!?它是指针a的先前内存地址吗?以前呢?或者它只与编译器有关? 谢谢。我希望我的问题不是太多了。 :)

2 个答案:

答案 0 :(得分:4)

此:

ptr[i]=buff;

不会复制字符串。它只是复制一个指针。所以没有你造成内存泄漏(你无法访问你刚刚分配的内存),但它混淆了你的程序,因为ptr[i]现在指向buff,所以每次你读一个新字符串,它似乎会影响ptr[]的所有元素。

请改为:

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

另请注意,使用gets被视为不良做法;考虑如果用户输入超过9个字符的字符串会发生什么。

答案 1 :(得分:1)

以下内容不正确:

ptr[i]=buff

您应该使用strcpy()代替作业。

否则,您为ptr的所有元素分配相同的指针,泄漏malloc()内存,并尝试free()您没有malloc()编辑的内容。< / p>