c - 超过为 char * 分配的大小时不会出现段错误

标签 c memory-management malloc char-pointer

<分区>

我使用 malloc 为 x 分配 n(y 的字符串长度)字节。然而,在将 y 复制到 x 之后,我在 x 中又添加了 3 个字符,包括 '\0' 并且没有出现错误。

因为我分配的空间只够容纳 10 个字符,所以在尝试将值分配给未分配的内存时,我不应该收到错误消息吗? 这是未定义的行为吗?

#include <stdio.h>
#include <stdlib.h>
#include <string.h>

int main(int *argc,char **argv)
{

    char *x,*y="123465412";
    int i,n;

    n=strlen(y);


    x=(char *)malloc(sizeof(char)*n);

    for(i=0; i<n ; i++)
        x[i]=y[i];

    x[i]='5';
    x[i+1]='5';
    x[i+2]='\0';

    puts(x);



}

最佳答案

没有。在 C 中,没有(内置的)测试来覆盖 malloc() 的缓冲区。在一个 malloced block 之后,您会在内存中找到另一个 malloced block 。因此,如果您在 malloced 缓冲区之外写入,您只需修改其他一些 block 。 (这当然是非常危险的,并且会导致您的代码出现奇怪的行为:通常称为意外结果。)

关于c - 超过为 char * 分配的大小时不会出现段错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29181344/

相关文章:

c - 从多个源文件构建内核模块,其中一个与模块同名

android - 如何从 android 使用 c lib(.so)?

c - malloc 和 free 问题

c - 'malloc' 可能是我程序的瓶颈吗?

c - malloc 和全局变量声明在 C 中将它们的变量分配到哪里?

c - 我们可以读取并错误注入(inject)另一个线程的程序计数器吗?

c - 是否可以在 Rust 中包装 C 枚举?

java - 服务器内存有限的图像处理

c - 返回指向函数内声明的复合文字的指针是否安全,还是应该使用 malloc?

c++ - 是否可以与另一个进程共享现有的 RAM block ?