malloc总是分配相同的地址

时间:2014-11-18 16:18:30

标签: c arrays pointers

我必须这样做: 编写函数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");
   }

}

2 个答案:

答案 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);