c - 使用 malloc 初始化 char 指针 VS 不使用 malloc 直接将字符串赋给 char 指针

标签 c arrays string pointers memory-management

我试图了解当涉及到字符和字符串时,内存分配是如何工作的。

我知道声明的数组的名称就像指向数组第一个元素的指针,但该数组将驻留在内存的堆栈中。

另一方面,当我们想要使用内存堆时,我们使用 malloc,但我发现你可以初始化一个 char 指针并在同一声明行上为其分配一个字符串,所以我有一些关于此事的问题:

1) 如果我只是初始化一个 char 指针并为其分配一个字符串,此信息位于何处? 在堆中?在堆栈中? 例如:char *pointer = "Hello world";

2) 我尝试使用 malloc 初始化我的 char 指针,并稍后使用它为它分配一个字符串,但我无法编译它,我收到错误,什么是这个逻辑有问题吗?这就是我想做的:

char *指针 = malloc(sizeof(char) * 12); *指针=“ Hello World ”;

您能帮我了解更多有关指针和内存分配的信息吗?非常感谢! :)

最佳答案

1) If I just initialize a char pointer and assign a string to it, where is this information living? In the heap? In the stack? Ex: char *pointer = "Hello world";

既不在栈上,也不在堆上。 “Hello world” 是一个字符串文字,通常在可执行文件的rodata(只读数据)段中创建。事实上,除非您以不同方式指定,否则编译器可以自由地仅存储 "Hello world" 的单个副本,即使您将其分配给多个指针也是如此。虽然通常您不能将字符串分配给指针,但由于这是一个字符串文字,您实际上是在为文字本身分配地址 - 这是唯一有效的原因。否则,正如 P__J__ 所指出的,您必须将字符串从一个位置复制到另一个位置。

2) I tried to use malloc to initialize my char pointer and use it later to assign a string to it, but I can't compile it, I get error, what is wrong with this logic? this is what I'm trying to do:

char *pointer = malloc(sizeof(char) * 12);
*pointer = "Hello world";

你在这里混合苹果和橙子。 char *pointer = malloc (12); 分配 12 个字符(字节)的存储空间,然后将该新存储 block 的起始地址分配给 pointer 作为其值。 (请记住,指针只是一个普通变量,它将其他内容的地址作为其值)

对于每次分配,都必须验证调用成功,否则您将需要处理失败。分配可以并且确实会失败,当失败时,malloc、calloc * realloc 都会返回NULL。因此,每次分配时,您

char *pointer = malloc(12);       /* note: sizeof (char) is always 1 */
if (pointer == NULL) {            /* you VALIDATE each allocation */
    perror ("malloc-pointer");
    return 1;
}

继续上面的情况,您已分配 12 字节并将新内存块的起始地址分配给 pointer。然后,您莫名其妙地取消引用pointer(例如,*pointer,现在具有char类型)并尝试分配字符串的地址文字作为该字符。

*pointer = "Hello world";    /* (invalid conversion between pointer and `char`) */

您看起来想要做的是将“Hello world”复制到指针保存的新内存块。为此,由于您已经知道 "Hello world" 是 12 个字符(包括 nul 终止 字符),因此您可以简单地:

memcpy (pointer, "Hello world", 12);

(注意:如果您已经知道长度,则无需调用 strcpy 并使其再次扫描字符串结尾)

现在,您新分配的内存块包含“Hello world”,并且内存是可变的,因此您可以更改任何您喜欢的字符。

既然您已经分配了存储空间,那么当该内存不再使用时,您就可以释放(指针);

简而言之,这就是将字符串文字的地址分配给指针,或分配存储并将新存储 block 中的第一个地址分配给指针,然后将您喜欢的任何内容复制到该新 block 之间的区别(只要您保持在已分配内存块的已分配边界内)。

仔细检查一下,如果您还有其他问题,请告诉我。

关于c - 使用 malloc 初始化 char 指针 VS 不使用 malloc 直接将字符串赋给 char 指针,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56964075/

相关文章:

objective-c - 为什么++ 运算符将整数增加 4 而不是增加 1?

c - 在 C 中返回指向 char 数组的指针

c - 如何使用LibRaw(c++)获取CR2图像的原始数据

javascript - 使用 jQuery .each 循环 JavaScript 多维数组时如何访问元素

javascript - 如何在 php 中获取包含一个数组对象的 serializableArray jQuery?

c - 为什么使用这样的定义?

python - 使用numpy区分两个 "symmetrical"数组

C : segmentation fault 11 结构中的 Char**

javascript - 从基于文本的内容中删除某些 html 标签

Java-如何用字符串调用类?