我一直在研究如何使用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指向数组的第一个元素。我不明白的是长度存储在哪里!?它是指针a的前一个内存地址吗?是以前吗?还是只和编译器有关?
谢谢。我希望这不是我要求的太多。:)

最佳答案

这:

ptr[i]=buff;

不复制字符串。它只是复制一个指针。所以你并没有造成内存泄漏(你没有办法访问你刚刚分配的内存),但是它把你的程序弄糟了,因为ptr[i]现在指向buff,所以每次你读一个新的字符串,它都会影响ptr[]的所有元素。
请改为:
strncpy(ptr[i], buff, BUF_SIZE);

还要注意,使用gets被认为是不好的做法;请考虑如果用户键入一个超过9个字符的字符串会发生什么情况。

关于c - 在C中使用malloc和buffer的字符串的指针数组,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/8806336/

10-11 22:53
查看更多