【问题标题】:pointer array with strings using malloc and buffer in C在 C 中使用 malloc 和缓冲区的字符串指针数组
【发布时间】: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

标签: c string pointers arrays


【解决方案1】:

这个:

ptr[i]=buff;

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

改为这样做:

strncpy(ptr[i], buff, BUF_SIZE);

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

【讨论】:

  • 谢谢!我使用了gets,因为我不知道如何将scanf() 与数组一起使用。现在想弄清楚。也许有一个 for 循环或其他东西
  • 嘿嘿代码还是有问题。出于某种原因,当我打印时,我在原始字符串之后得到了一些垃圾。这可能是由于不好的malloc吗?
【解决方案2】:

以下不正确:

ptr[i]=buff

您应该使用strcpy() 而不是赋值。

否则你将相同的指针分配给ptr的所有元素,泄漏malloc()ed内存,并尝试free()你没有malloc()ed的东西。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多