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我很抱歉打扰了你。