【发布时间】:2012-01-10 16:03:32
【问题描述】:
我被困在如何使用 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的前一个内存地址吗?是以前吗?还是仅与编译器有关?
谢谢。我希望我问的不是太多。 :)
【问题讨论】:
-
您应该阅读任何一本好书中的 C 语言字符串。这可能是一个有点棘手的话题。
-
如你所说,当数组声明为a[10]时,指针a指向第一个元素的地址。但是,任何地方都没有存储长度。确保只使用 10 个字节是程序员的任务!数组 a。更一般地,对于您使用的任何数组,数组的长度必须由程序维护。
-
修复了数组的问题,但我在原始消息之后打印了一些垃圾......如果有人能在代码中看到错误请评论。谢谢
-
已修复!
ptr[i]=malloc(strlen(buff)+1); strncpy(ptr[i], buff, strlen(buff)+1);我无法定义字符串结尾,因为我没有复制 +1 elenete (\0)。 :D