在这个简单的C程序中分配内存时我哪里出错了?

时间:2017-09-28 23:08:25

标签: c string pointers memory-management realloc

该程序的目标是从终端获取用户输入,然后打印出用户输入的每个单词的最后一个字符。

例如," Hello World"应该打印出来" od"。

这是代码。当我尝试调整char指针的大小时,我不确定我的错误在哪里。代码如下。

只有在gcc

的参数中使用-fsanitize = address时才会出现此问题
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main(int argc, char **argv)
{
    char *shortened = NULL;
    int i = 1;
    while(argv[i] != NULL)
    {
        shortened = realloc(shortened, 1 * (sizeof(char)));
        int length = strlen(argv[i]);
        char* curWord = argv[i];
        shortened[i-1] = curWord[length -1];
        i++;
    }
    printf("%s\n", shortened);
    return 0;
}

3 个答案:

答案 0 :(得分:2)

你想重新分配i个字符,加上一个空终止符,所以改变它(它只分配一个字符):

shortened = realloc(shortened, 1 * (sizeof(char)));

到此:

shortened = realloc(shortened, (i + 1) * (sizeof(char)));

答案 1 :(得分:0)

您对realloc的调用始终只分配一个字符。你不想要我的角色吗?     的realloc(的sizeof(字符)*(1 + I));

答案 2 :(得分:0)

首先,回答你的问题 - realloc得到新尺寸的第二个参数,而不是尺寸的增加。您需要使用您拥有的单词数量,并相应地更改大小。

其次,argv包含命令行参数,这意味着在可执行文件名后面写入了令牌。要获得用户的输入,您可能需要使用scanf