关于char*缓冲区和char缓冲区的内存分配[5]
我想问一个关于char*buffer的内存分配问题;缓冲区=malloc(5);和字符缓冲区[5] 我的测试代码如下:]关于char*缓冲区和char缓冲区的内存分配[5],c,ubuntu,memory,stack,C,Ubuntu,Memory,Stack,我想问一个关于char*buffer的内存分配问题;缓冲区=malloc(5);和字符缓冲区[5] 我的测试代码如下:] #include <stdio.h> void echo1(); void echo2(); int main() { echo1(); printf("\n"); echo2(); printf("Back to Main \n"); return 0; } void echo1() { int i;
#include <stdio.h>
void echo1();
void echo2();
int main() {
echo1();
printf("\n");
echo2();
printf("Back to Main \n");
return 0;
}
void echo1() {
int i;
unsigned long addr;
char *buffer;
printf("[Echo1] Buffer : %p \n", buffer);
printf("[Echo1] &Buffer : %p \n", &buffer);
buffer = malloc(5);
printf("[Echo1] &Buffer : %p \n", &buffer);
printf("[Echo1] Buffer : %p \n", buffer);
for (i = 0; i < 5; i++) {
buffer[i] = 'A';
}
printf("[Echo1] Buffer[] : %s \n", buffer);
addr = &buffer;
printf("[Echo1] *Buffer : %p \n", *buffer);
printf("[Echo1] addr : %p \n", addr);
printf("[Echo1] &addr : %p \n", &addr);
}
void echo2() {
int i;
unsigned long addr;
char buffer[5];
printf("[Echo2] Buffer : %p \n", buffer);
printf("[Echo2] &Buffer : %p \n", &buffer);
for (i = 0; i < 5; i++) {
buffer[i] = 'A';
}
printf("[Echo2] Buffer[] : %s \n", buffer);
addr = &buffer;
printf("[Echo2] *Buffer : %p \n", *buffer);
printf("[Echo2] addr : %p \n", addr);
printf("[Echo2] &addr : %p \n", &addr);
}
#包括
void-echo1();
void-echo2();
int main(){
echo1();
printf(“\n”);
echo2();
printf(“返回主\n”);
返回0;
}
void echo1(){
int i;
无符号长地址;
字符*缓冲区;
printf(“[Echo1]缓冲区:%p\n”,缓冲区);
printf(“[Echo1]&缓冲区:%p\n”,&缓冲区);
缓冲区=malloc(5);
printf(“[Echo1]&缓冲区:%p\n”,&缓冲区);
printf(“[Echo1]缓冲区:%p\n”,缓冲区);
对于(i=0;i<5;i++){
缓冲区[i]=“A”;
}
printf(“[Echo1]Buffer[]:%s\n”,Buffer);
addr=&buffer;
printf(“[Echo1]*缓冲区:%p\n”,*缓冲区);
printf(“[Echo1]地址:%p\n”,地址);
printf(“[Echo1]&地址:%p\n”,&addr);
}
void echo2(){
int i;
无符号长地址;
字符缓冲区[5];
printf(“[Echo2]缓冲区:%p\n”,缓冲区);
printf(“[Echo2]&缓冲区:%p\n”,&缓冲区);
对于(i=0;i<5;i++){
缓冲区[i]=“A”;
}
printf(“[Echo2]Buffer[]:%s\n”,Buffer);
addr=&buffer;
printf(“[Echo2]*缓冲区:%p\n”,*缓冲区);
printf(“[Echo2]地址:%p\n”,地址);
printf(“[Echo2]&地址:%p\n”,&addr);
}
我在ubuntu上通过键入gcc test.c-o test-m32编译了它(我使用的是64位机器)。下图显示了结果。
我想我理解了echo1()的情况(除了为什么addr位于缓冲区之上),并制作了一个图来显示内存中发生了什么。
但我不知道echo2()案发生了什么
因此,我想问以下问题:
malloc()
返回并存储在指针中的地址来自堆
注意:您的代码还显示了许多未定义行为的来源,例如
- 使用
说明符打印%p”
*缓冲区
- 打印未初始化的指针
- 打印
未初始化的无符号长地址
并使用
说明符,这两个说明符都调用未定义的行为“%p”
- 使用
说明符打印非“%s”
终止的数组null
echo2()
和整个程序中出现给定的行为
为什么相同
堆栈上数组的地址与其第一个元素的地址相同。不同之处在于结果指针的大小不同,因此它们会递增
中间是什么
指针的地址是堆栈地址,而malloc()
返回并存储在指针中的地址来自堆
注意:您的代码还显示了许多未定义行为的来源,例如
- 使用
说明符打印%p”
*缓冲区
- 打印未初始化的指针
- 打印
未初始化的无符号长地址
并使用
说明符,这两个说明符都调用未定义的行为“%p”
- 使用
说明符打印非“%s”
终止的数组null
echo2()
和整个程序中出现给定的行为
有人能给我一个数字来帮助我理解发生了什么吗
ehco2()
对于整个问题,最好的答案是使用gcc的-O0标志生成未优化的代码,并在调试器中运行它,或者还使用-s来查看与它生成的代码相对应的程序集