繁体   English   中英

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

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

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM