C 不应该';这不是你的错吗?为什么会有一个;未分配要释放的指针";错误?
关于以下代码,我有两个问题:C 不应该';这不是你的错吗?为什么会有一个;未分配要释放的指针";错误?,c,segmentation-fault,C,Segmentation Fault,关于以下代码,我有两个问题: #include <stdlib.h> #include <stdio.h> char *ft_strnew(size_t size) { char *result; size_t i; result = (char *) malloc(sizeof(char) * size); if (result) { i = size; while
#include <stdlib.h>
#include <stdio.h>
char *ft_strnew(size_t size)
{
char *result;
size_t i;
result = (char *) malloc(sizeof(char) * size);
if (result)
{
i = size;
while (i > 0)
{
result[i - 1] = '\0';
i = i - 1;
}
}
return (result);
}
int main(void)
{
char *test;
test = ft_strnew(1);
if (test)
{
test[2] = '\0';
test[1] = '1';
test[0] = '1';
printf("%s", test);
//free(&test);
}
return (0);
}
如果我在我的main()
中取消注释包含free()
调用的行,我会得到:
11%
test(27744,0x7fff7941d300) malloc: *** error for object 0x7fff558b16d0: pointer being freed was not allocated
*** set a breakpoint in malloc_error_break to debug
11zsh: abort ./test
1-为什么在第一种情况下,它没有故障?
我创建的char*
的大小是(1*sizeof(char))
。
但是我可以在其中添加三个字符('1','1','0')
这不应该是你的错吗
2-为什么在第二种情况下存在免费问题?
即使我创建了一个char*
,并将3传递给ft\u strnew()
,也会发生这种情况。
我使用malloc()
调用创建char*
,内存不应该分配吗
1-为什么在第一种情况下,它没有故障
它导致未定义的行为,这允许任何操作。程序可能会按预期工作,可能会出现故障。。。什么都行
2-为什么在第二种情况下存在免费问题
您试图释放指针的地址,而不是
malloc
指定区域的地址free(test)
应该可以正常工作。溢出从malloc()
(或calloc()
或new
或任何其他类似的动态内存函数)返回的数组并不总是导致任何故障的一个原因是:
7.20.3内存管理功能
。。。如果分配成功,则返回的指针为
对齐,以便可以将其指定给指向任何类型对象的指针
然后用于访问中的此类对象或此类对象的数组
分配的空间
实际上,这意味着
malloc()。例如,如果对象(如double
或long-long
值)被限制为8字节的倍数,则这可能是8字节。因此,如果您malloc()
1个字节,实际上可以得到8个字节,并且可以“避免”缓冲区溢出多达7个字节。如果你malloc()
11个字节,实际上你会得到16个字节。但是如果你malloc()
32个字节,你实际上得到的正好是32个字节,并且根本无法“逃脱”缓冲区溢出的惩罚。你似乎对(2)是正确的,我的错,那是愚蠢的。对于(1)我认为,如果我试图访问一个我没有分配的地址,它应该自动segfault,所以这只是一个风险?@vmonteco是的。C标准没有“分段错误”的概念。它只知道未定义的、实现定义的、未指定的、定义良好的(可能还有其他我忘记的)行为。我不知道!谢谢。在开发人员停止发布之前,这些废话需要有多少次重复?我投票结束这个问题,因为,再一次,我要求解释一些已知的严重错误。Tstupid的这个子类是“tarraybundsstupid”。@MartinJames我很抱歉打扰了你。