小内存分配问题C++

Minor memory allocation question C++

本文关键字:C++ 问题 分配 内存      更新时间:2023-10-16
int main() {

  char **k;
  char *s ="abc"; 
  char *b ="def";
  *k = s;

}

//为什么这会产生分割错误?难道所有东西都应该毫无问题地存储在堆栈中吗?

k尚未定义值,因此取消引用它(*k(会导致未定义的行为。如果添加初始化,即k = &b;,则*k = s;将在之后工作。

好吧,我希望我不会因为任何轻微的错误而被打败。。。这是我试图尽可能全面地解释它。

对于一个普通的char*,它将指向一个char。

使用一个字符**,它指向一个指向字符的指针。这个*k值在堆上,而不是在堆栈上。

例如:

stack (1)    heap (2)   heap or ... (3)
+-----+    +-----+     +----+
|char*| -> |char*| ->  |char|
+-----+    +-----+     +----+

现在char*并不是真正的字符串,但它们被视为内存中由null或零字节终止的连续可打印字符块。因此,字符串将被存储并在(3(中被引用

因此,为了修复代码,您需要为char*(而不是char(分配空间。

即放入

k = (char**)malloc(sizeof(char*));

在线之前

*k = s;

并不是说这是一个好代码,但它不应该崩溃。

Alexander是正确的,您正在用*k = s;取消引用kchar *s="abc";的初始化看起来可能是一样的,但它是更长时间的语法糖:char *s; s="abc";