高级C内存分配

高级C内存分配,c,C,所以,我继续学习C。我有一些有趣的问题。 若我并没有把东西放在堆上,那个么我必须使用malloc等。。 但是char*str呢? str将位于哪个内存段中? 我读到它将被放在.bss段上。这就是为什么不能在C中更改字符串。这是正确的吗?还是会被放在堆栈上 如果是,为什么程序结束时不需要释放内存? 每个函数的内存段代码位于哪个位置?换句话说,指向函数的指针将指向哪个段? 谢谢你的帮助! 只是想更好地理解C语言中的内存管理。如果你只说char*str,那么数组的内存将不会被分配,而只分配指针本身的内

所以,我继续学习C。我有一些有趣的问题。 若我并没有把东西放在堆上,那个么我必须使用malloc等。。 但是char*str呢? str将位于哪个内存段中? 我读到它将被放在.bss段上。这就是为什么不能在C中更改字符串。这是正确的吗?还是会被放在堆栈上

如果是,为什么程序结束时不需要释放内存? 每个函数的内存段代码位于哪个位置?换句话说,指向函数的指针将指向哪个段? 谢谢你的帮助! 只是想更好地理解C语言中的内存管理。

如果你只说char*str,那么数组的内存将不会被分配,而只分配指针本身的内存。您需要手动为字符串分配内存,可能是在堆上,也可能是手动释放它

不能更改C中的字符串,因为它是错误的。您不能更改字符串常量,字符串常量是在类似.rodata的只读部分中分配的。函数代码和其他代码一样,位于.text中。

如果只说char*str,则不会为数组分配内存,只为指针本身分配内存。您需要手动为字符串分配内存,可能是在堆上,也可能是手动释放它

不能更改C中的字符串,因为它是错误的。您不能更改字符串常量,字符串常量是在类似.rodata的只读部分中分配的。函数代码与任何其他代码一样,位于.text中。

如果您将定义放入char*str;在函数内部,则它是指向char的指针类型的自动变量

它位于堆栈上,当函数返回时,堆栈的该部分将变得未使用。编译器会根据需要发出代码来移动堆栈指针,从而为您处理该部分。从理论上讲,堆栈的存在纯粹是一个实现细节,在实践中C总是有一个调用堆栈,几乎所有的实现都或多或少地以相同的方式管理调用堆栈,而不管它实际上是如何管理的,存储自动变量的内存很可能被称为堆栈

如果你把一个定义char*str;在任何函数之外,则它是一个具有静态存储持续时间的全局变量

它存储在一个读写数据段中,当程序退出时就不再使用了——可能是操作系统为您处理的,尽管原则上它可能是编译器发出的代码。由于它是零初始化的,并且假设架构上的空指针由所有位零yes表示,因此它可以进入bss段,这是专门针对具有静态存储持续时间的零初始化读写对象的。同样,静态持续时间的对象如何存储的细节取决于实现,但这也是通常的实现方式

这些都与字符串文字不可修改无关,因为您还没有定义字符串,更不用说使用字符串文字了。您已经定义了一个指针,它可以指向一个字符串,但还没有这样做;在函数内部,则它是指向char的指针类型的自动变量

它位于堆栈上,当函数返回时,堆栈的该部分将变得未使用。编译器会根据需要发出代码来移动堆栈指针,从而为您处理该部分。从理论上讲,堆栈的存在纯粹是一个实现细节,在实践中C总是有一个调用堆栈,几乎所有的实现都或多或少地以相同的方式管理调用堆栈,而不管它实际上是如何管理的,存储自动变量的内存很可能被称为堆栈

如果你把一个定义char*str;在任何函数之外,则它是一个具有静态存储持续时间的全局变量

它存储在一个读写数据段中,当程序退出时就不再使用了——可能是操作系统为您处理的,尽管原则上它可能是编译器发出的代码。由于它是零初始化的,并且假设架构上的空指针由所有位零yes表示,因此它可以进入bss段,这是专门针对具有静态存储持续时间的零初始化读写对象的。同样,静态持续时间的对象如何存储的细节取决于实现,但这也是通常的实现方式


这些都与字符串文字不可修改无关,因为您还没有定义字符串,更不用说使用字符串文字了。您已经定义了一个指针,它可以指向一个字符串,但还没有这样做。

在C中,所有局部变量都将放在堆栈上。变量str是一个字符指针。它包含一个内存地址。堆栈上只有名为str的指针

这将以堆栈上32/64位上的指针4或8字节大小分配内存

malloc在he上分配1024字节 并返回指向该内存区域第一个字节的指针。此指针保存在堆栈上的str中

当str是局部变量的函数返回时,变量str将被释放

str指向的内存区域将不会自动释放。您需要使用freestr手动执行此操作

字符串可以修改!但不是常量文字:

char string[4] = "foo";
string[0] = 'F'; //will work

char * stringconst = "foo";
stringconst[0] = 'F'; // this will segfault

上面的方法行不通,因为foo将被放在只读内存区域。

在C中,所有局部变量都将放在堆栈上。变量str是一个字符指针。它包含一个内存地址。堆栈上只有名为str的指针

这将以堆栈上32/64位上的指针4或8字节大小分配内存

malloc在堆上分配1024个字节,并返回指向该内存区域第一个字节的指针。此指针保存在堆栈上的str中

当str是局部变量的函数返回时,变量str将被释放

str指向的内存区域将不会自动释放。您需要使用freestr手动执行此操作

字符串可以修改!但不是常量文字:

char string[4] = "foo";
string[0] = 'F'; //will work

char * stringconst = "foo";
stringconst[0] = 'F'; // this will segfault

上面的方法行不通,因为foo可能会被放在只读内存区域。

我想你已经把指针和它们指向的东西弄糊涂了。拿这个来说:

char *str = "Hello";
如果是在文件范围内声明的,那么str是一个静态分配的指针。它指向的字符串是完全独立的。你可以让str指向任何东西

如果它是在函数中声明的,则str是在堆栈上分配的指针。同样,文字是分开的

事实上,如果你有这两行:

char *str1 = "Hello";
char *str2 = "Hello";
编译器可以让每个指针指向内存中的同一地址

字符串文本是静态分配的,与指针无关,并且通常放置在初始化的只读数据段中


还要记住,堆、堆栈和段的所有概念都纯粹与实现相关,而不是与语言相关。

我认为您混淆了指针及其指向的内容。拿这个来说:

char *str = "Hello";
如果是在文件范围内声明的,那么str是一个静态分配的指针。它指向的字符串是完全独立的。你可以让str指向任何东西

如果它是在函数中声明的,则str是在堆栈上分配的指针。同样,文字是分开的

事实上,如果你有这两行:

char *str1 = "Hello";
char *str2 = "Hello";
编译器可以让每个指针指向内存中的同一地址

字符串文本是静态分配的,与指针无关,并且通常放置在初始化的只读数据段中


还要记住,堆、堆栈和段的所有概念都纯粹与实现相关,而不是与语言相关。

在阅读类似问题的答案时,我只找到了两个链接。这些可能会帮助你更好地理解这件事


在阅读类似问题的答案时,我发现了两个链接。这些可能会帮助你更好地理解这件事


在C语言中,我们可以通过字符数组或字符指针引用字符串

char *str = "storage of strings"  
案例1:如果字符串被称为字符数组:

char[] = "storage of strings";  
如果上面的声明是全局的,那么它将存储在数据段中,否则它将存储在堆栈段中

案例2:如果字符串由字符指针引用,并且在运行时分配内存,即使用malloc、calloc

char *str = (char *)malloc(sizeof(char)*size);  
在这种情况下,内存是从堆段分配的

案例3:若字符串由字符指针引用,字符串值直接分配给字符指针

char *str = "storage of strings"  
在这种情况下,这将存储在数据段中。这就像在数据段中为字符串文本分配内存,并将该字符串文本的地址分配给str变量


PS:在运行时堆段分配的每个内存都需要在程序本身中释放。因此,如果使用malloc、calloc或任何在运行时分配内存的函数,则需要使用free

在C中,我们可以通过字符数组或字符指针引用字符串

char *str = "storage of strings"  
案例1:如果字符串被称为字符数组:

char[] = "storage of strings";  
如果上面的声明是全局的,那么它将存储在数据段中,否则它将存储在堆栈段中

案例2:如果字符串由字符指针引用,并且在运行时分配内存,即使用malloc、calloc

char *str = (char *)malloc(sizeof(char)*size);  
在这种情况下,内存是从堆段分配的

案例3:若字符串由字符指针引用,字符串值直接分配给字符指针

char *str = "storage of strings"  
在这种情况下,这将存储在数据段中。这就像在数据段中为字符串文本分配内存,并将该字符串文本的地址分配给str变量

PS:在运行时堆段分配的每个内存都需要在
程序本身。因此,如果使用malloc、calloc或任何在运行时分配内存的函数,则需要使用free

也许这有助于声明char*str;仅为单个指针对象分配空间。如果要指向可能包含或不包含字符串的数组,则必须通过调用malloc、使用字符串文字、定义数组对象或其他方式来分配该内存。Hi。我的问题是这段记忆会在哪里?在堆栈上还是在bss段上?@Farseer,您可以在其中分配它。C甚至不需要存在堆栈。大多数实现都使用一个,但它不是标准的一部分;仅为单个指针对象分配空间。如果要指向可能包含或不包含字符串的数组,则必须通过调用malloc、使用字符串文字、定义数组对象或其他方式来分配该内存。Hi。我的问题是这段记忆会在哪里?在堆栈上还是在bss段上?@Farseer,您可以在其中分配它。C甚至不需要存在堆栈。大多数实现都使用一个,但它不是标准的一部分。