【问题标题】:Dynamic Allocation from input file来自输入文件的动态分配
【发布时间】:2013-04-29 21:43:00
【问题描述】:

考虑以下几点:

typedef struct wordType
{
    char word;
    uint count;
};

int main( void ) 
{
    typedef struct wordType * WORD_RECORD;
    WORD_RECORD arrayOfWords = malloc(10 * sizeof( WORD_RECORD) );

    FILE * inputFile;
    char temp[50];
    uint index;
    inputFile = fopen( "input.txt", "r"); 

    while( fscanf( inputFile, "%s", temp) == 1 )
        {
        printf("%s\n", temp );
        arrayOfWords[index].word = malloc( sizeof(char)*(strlen(temp) + 1 ));

        strcpy( arrayOfWords[index].word, temp );
    }
    index++;
}

每次通过scanf输入一个单词时,我都会尝试malloc。但是,我似乎无法弄清楚为什么这不起作用。我收到错误:

warning: assignment makes integer from pointer without a cast

warning: passing argument 1 of ‘strcpy’ makes pointer from integer without a cast

【问题讨论】:

  • arrayOfWords[index].word的类型是什么?
  • 我编辑了上面的代码,你可以看到。

标签: c malloc strcpy


【解决方案1】:

一个 c 字符串是 char* 类型的。当你说

char word;

你只为一个角色创造了足够的空间,而不是整个事物。制作字型char*:

char* word;

别忘了设置计数。

此外,您可能需要注意不要阅读超过 10 行,否则会出现另一个内存错误。

【讨论】:

  • 那是我的错,我编辑了代码。它应该(我希望)是我制作的结构数组。
  • 现在,当我设置一个循环来遍历结构数组并打印出单词时,我遇到了分段错误。这是由于我试图将单词复制到数组中的方式吗?
  • strncpy 将是 strcpy 更安全的替代方案,尤其是在您怀疑有错误时。
  • 不,strncpy 只会给出无法复制 nul 终止符的可能性。 @SeanHellebusch 您发布的代码中唯一的错误是word 的类型。如果您修复了该问题但仍有问题,则可能值得将更新后的代码作为新问题发布。
  • 如果我正在读取我无法控制的输入,那么尽可能多地阻止它是有意义的,因此是 sprintf,并添加了你提到的 null。您还需要确保 fscanf 永远不会获得超过 50 个字符的行。 stackoverflow.com/questions/1621394/…
【解决方案2】:

您想使用word 作为字符串。字符串是一个以 null 结尾的字符数组,因此您需要为其指定类型 char*。由于您为每个单词动态分配内存,请确保稍后对每个单词调用free

或者,您可以利用 temp 是一个 50 字符数组和硬编码 word 以具有相似大小这一事实。

最后一点,sizeof(char) 保证为 1,因此您可以简化您的 malloc 计算。

【讨论】:

    猜你喜欢
    • 2012-04-22
    • 2017-02-28
    • 2015-08-05
    • 2018-04-12
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-03-18
    • 2010-12-04
    相关资源
    最近更新 更多