gpt4 book ai didi

c - 使用 calloc 手动输入 chars 导致崩溃

转载 作者:太空宇宙 更新时间:2023-11-04 05:56:44 25 4
gpt4 key购买 nike

我这里有这段代码。

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
int main()
{
int *size;
int i = 0;
char buf[] = "Thomas was alone";
size = (int*)calloc(1, sizeof(buf)+1);
for(i=0; i<strlen(buf); i++)
{
*(size+i) = buf[i];
printf("%c", *(size+i));
}
free(size);
}

据我了解,calloc 保留了一个内存空间,其大小为第一个 arg 乘以第二个,在本例中为 18。buf 的长度为 17,因此 for 循环应该没有任何问题。

运行这个程序会产生预期的结果(它打印出 Thomas was alone),但是它也立即崩溃了。除非我增加 calloc 的大小(比如乘以 10),否则这种情况会持续存在。

我是不是理解错了什么?我应该使用一个函数来防止这种情况发生吗?

最佳答案

int *size 表示您需要:

size = calloc(sizeof(int), sizeof(buf));

您为 char 数组分配了足够的空间,但没有为 int 数组分配空间(除非您在一个奇怪的系统上,其中 sizeof(char) == sizeof(int),这是一种理论上的可能性,而不是实际的可能性)。这意味着您的代码写入远远超出分配的内存末尾,这就是导致崩溃的原因。或者您可以使用 char *size,在这种情况下,对 calloc() 的原始调用是可以的。

请注意,sizeof(buf) 包括终端 null; strlen(buf) 没有。这意味着您过度分配了 +1 术语。

您也可以完全明智地编写 size[i] 而不是 *(size+i)

关于c - 使用 calloc 手动输入 chars 导致崩溃,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26167160/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com