【问题标题】:What is the cause of pointer alighnment issue?指针对齐问题的原因是什么?
【发布时间】:2013-03-10 20:16:25
【问题描述】:

我的程序从文件中读取单词,并将它们作为多个单词存储在动态分配的数组中。

我的问题是,当我打印数组时,在 while 循环中,它似乎指向了正确的单词。在代码通过 while 循环后,当我打印所有索引时,'ice' 是最后一个词,我试图找出原因。

FILE *fileptr=fopen("file.txt","r");

char** DataArray;
int num_of_words=0;

char str[10];

while(fscanf(fileptr,"%s",&str)!=-1)
{
    num_of_words++;
}

DataArray=(char**)malloc(num_of_words*sizeof(char*));

rewind(fileptr);

int i=0;

while(fscanf(fileptr,"%s",&str)!=-1)
{
    printf("%s",str);
    int len=strlen(str);
    printf("\t%d",len);

    DataArray[i]=(char*)malloc(len*sizeof(char));
    DataArray[i]=str;
    printf("\t%s\n",DataArray[i]);
    i++;
}

printf("\n");
//printf("%s\n",*(DataArray+2));
printf("%s\n",DataArray[0]);
printf("%s\n",DataArray[1]);
printf("%s\n",DataArray[2]);


fclose(fileptr);

输出:

apple  5   apple
mango  5   mango
ice  3   ice

ice
ice
ice

【问题讨论】:

  • 回答这个问题至少5次:DataArray[i]=strdup(str);
  • 非常感谢,是的,已修复它:) 如果可能的话,您能否告诉我出了什么问题或给出您之前可能回答过此问题的链接。再次感谢。跨度>
  • 你在看哪本书?

标签: c arrays double-pointer


【解决方案1】:

仅分配一个指针是不够的。尤其是当 str 每次通过循环都取一个新值时。

DataArray[i]=(char*)malloc(len*sizeof(char));
DataArray[i]=str;
printf("\t%s\n",DataArray[i]);
i++;

你必须使用你编写这个程序的方式strcpy,因为你已经使用malloc分配了空间。您也可以使用 strdup,但这会为您创建动态存储。如果由我决定,我会按照你写的方式来写,先使用 malloc,然后

strcpy(DataArray[i], str);

【讨论】:

    【解决方案2】:

    DataArray[i] = malloc(len); 在此表达式中,malloc 分配len 字节并返回指向这些字节的指针。该指针被分配给DataArray[i]。

    DataArray[i] = str; 这个表达式将指向 str 的第一个字节的指针分配给DataArray[i],这不是您期望它做的事情。还记得你从malloc 得到的那个指针吗?去哪儿了?

    我建议使用strcpy 函数,因为它旨在将字符串从一个数组复制到另一个数组:

    DataArray[i] = malloc(len + 1); // remember to allow space for a '\0' terminator!
    strcpy(DataArray[i], str);
    

    ps。不要强制转换 malloc 的返回值,也不要乘以sizeof (char)。除了使您的代码更难阅读之外,这些都没有意义。这是一个常见的问题,大多数书籍都回答了这个问题。你在看哪本书?

    【讨论】:

    • 为什么这被否决了?它出什么问题了?我们只是在教基本的 C,当你第一次学习它时会感到困惑,特别是认为你可以分配一个指针,然后复制字符串。这可能是另一个驱动式的否决票。
    • 我也在想同样的事情。谢谢你问我。我能做些什么来改善我的答案,神秘的否决者?
    • 是的,谢谢你,他们两个似乎都没有必要;会记住他们。书籍:C、Hanly、Jeri R 和 Elliot.B Koffman 中的问题解决和程序设计
    • @Nilayan 很好。 strlen("What") 是什么? “什么”需要多少个字符?您可以在第 8 章中找到这两个问题的答案以及您的原始帖子。malloc(strlen("What")); 分配了多少个字符?将“What”存储为字符串需要多少个字符?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-01-17
    • 2011-05-18
    • 1970-01-01
    • 1970-01-01
    • 2021-01-18
    • 1970-01-01
    • 2022-01-21
    相关资源
    最近更新 更多