malloc缓冲区溢出(C)



如果以前有人回答过这个问题,我很抱歉,但我一直在疯狂地寻找答案。我一直在使用malloc创建一个数组:

char *message = (char*) malloc(31 *sizeof(char));

要让用户输入最多30个字符的消息:

 fgets(message, 30, stdin);

在另一个函数中,我尝试将消息转换为小写,并将其存储在另一字符串中(希望长度与消息相同)。

int length_message = strlen(message) - 1;
char *temp1 = (char*) malloc(length_message * sizeof(char));
for(int i=0; message[i] != ''; i++) 
{
        temp1[i] = tolower(message[i]);     
}

但是当我显示新字符串时

puts(temp1);

它显示了我的输入信息,然后在一行新行上显示了一大堆胡言乱语。我不明白这是从哪里来的。

此外,在检查我的temp1数组的长度和我为长度消息创建的值时,使用:

printf("length of temp array: %d", strlen(temp1));
printf("length of message: %dn", length_message);

它返回了所需的length_message(用户在消息中输入的字符数),但我的临时数组的长度是错误的!我是否错误地为临时数组分配了内存,或者没有正确写入该数组?

从我在其他线程上读到的内容来看,我似乎有一个缓冲区溢出错误?我该如何控制?

提前感谢!

这:

strlen(message) - 1

当然应该是这样的:

strlen(message) + 1

你错别字了。

您的代码有几个问题。

实际错误是由于没有将终止的0字符从源字符串复制到目标字符串。您需要在for循环之后编写一个temp[i] = 0;

此外,确实存在缓冲区溢出的可能性,因为复制的malloc()比字符串的长度少一个字符。(为什么…?您应该再分配一个…)

进一步的问题包括void *可怕的强制转换、冗余的(因此不安全的)sizeof(char)以及硬编码的缓冲区大小。

代替

char *message = (char*) malloc(31 *sizeof(char));

尝试

#define BUF_SIZE 31
char *message = malloc(BUF_SIZE);
fgets(message, BUF_SIZE, stdin);

或者如果你觉得迂腐,那么

char *message = malloc(BUF_SIZE * sizeof message[0]);

当您是malloc()内存时,永远不要sizeof()中使用硬编码类型。但无论如何,我认为你根本不需要malloc()。为什么不使用自动数组(一个"堆栈分配"的数组,尽管这不是它的正确名称)?然后,在获取用户输入时可以利用sizeof运算符。

此外,strlen()和其他几个stdlib函数返回size_t。您绝对应该使用该类型而不是int

相关内容

  • 没有找到相关文章

最新更新