为什么此代码有效,但不会产生分段错误?

Als*_*man -1 c malloc pointers

为什么这段代码没有给我分段错误?我只分配了1个字符,但输入了1个以上的字符。

char **names;

names=malloc(2*sizeof(char *));
names[0]=malloc(sizeof(char)*1) ;

names[0]="ATCAHCTACHATCCACTATCAHCTACHATCCACTATCAHCTACHATCCACTATCAHCTACHATC";

printf("%s",names[0]);
Run Code Online (Sandbox Code Playgroud)

我希望它会产生细分错误。

Sou*_*osh 6

在你的代码中

names[0]=malloc(sizeof(char)*1) ;
names[0]="ATCAHCTACHATCCACTATCAHCTACHATCCACTATCAHCTACHATCCACTATCAHCTACHATC";
Run Code Online (Sandbox Code Playgroud)

您基本上是在覆盖变量的值names[0],即存储指向它的另一个指针(字符串文字的起始地址)。没有理由应该产生分段错误。但是,这将导致内存泄漏,因为您将丢失返回的原始指针,malloc()并且将永远没有机会free()

OTOH,如果您会写类似

names[0]=malloc(sizeof(char)*1) ;
strcpy(names[0], "ATCAHCTACHATCCACTATCAHCTACHATCCACTATCAHCTACHATCCACTATCAHCTACHATC");
Run Code Online (Sandbox Code Playgroud)

在尝试访问超出分配范围的内存位置的地方,您将调用未定义的行为。再者,分割错误是许多可能的副作用之一,它从未被保证。