我必须这样做:
编写函数void AddName(char *Names[], int *size)
,它接受一个字符串数组名称和一个整数大小的指针。
检查是否还有足够的空间存储新名称。
如果有,请求用户输入他的名字并将其存储在大量的char(100个字符)中。
计算他的名字长度。
分配动态内存以存储其名称并将其位置存储在其中一个名称中 索引。
将尺寸增加一个。
我已编写此代码,但malloc始终分配相同的地址,因此整个数组名称变得相似
int const MAX = 3;
void AddName(char *Names[],int *size)
{
int tempsize = *size;
char *s;
if (tempsize > MAX)
printf("\n ERROR: Array is full. Cannot add.");
else
{
int i,len=0;
char name[100];
printf("Enter the name: ");
scanf("%s",name);
for(i=0; name[i]!='\0'; i++)
len++;
s = (char *)malloc((len+1)*sizeof(char));
s = &name;
Names[*size]=s;
*size=*size+1;
printf("\n Done.\n");
}
}
答案 0 :(得分:3)
分配内存后,将地址存储到变量s
。
然后使用name
变量的地址覆盖该值。
因此,您永远不会知道分配的地址,因为您通过覆盖将其丢弃。
答案 1 :(得分:0)
s = &name;
这是错误的。您正在删除malloc
刚刚返回给您的地址。您想要的是将name
的内容复制到记忆位置s
。为此,您需要strncpy
。将s = &name
替换为:
strncpy(s, name, len);
或者,既然您知道strlen(name) == len
,并且您分配了足够的内存,那么您可以使用strcpy()
:
strcpy(s, name);