堆,栈,常量区,字符串等问题(二)

本文探讨了C语言中不同类型的内存分配方法,包括栈内存、堆内存及常量区的特点。通过具体示例说明了如何正确使用指针进行内存操作,并分析了几种常见错误及其解决办法。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

上一篇学习地址
char *a 与char a[] 的区别
http://blog.youkuaiyun.com/qq_26437925/article/details/52136298


main()
{
    char*a[]={"work","at","alibaba"};
    char**pa=a;
    pa++;
    printf("%s",*pa);
}

这里写图片描述


void GetMemory(char *p, int num)   
{   
    p = (char *)malloc(sizeof(char) * num);   
}   
void Test(void)   
{   
    char *str = NULL;   
    GetMemory(str, 100);  // str 仍然为NULL   
    strcpy(str, "hello"); // 运行错误  
}  

对比如下

void GetMemory(char **p, int num)   
{   
    *p = (char *)malloc(sizeof(char) * num);   
}   
void Test(void)   
{   
    char *str = NULL;   
    GetMemory(&str, 100);
    strcpy(str, "hello");
    printf("%s\n", str);
    free(str);
}  
形参  -》  实参 (值,指向)
int a =》 int *a
(要真正的改变a的值,用a的指针 *a)

int *a =》 int **a
(要真正改变a的指向,用*a的指针**a)

堆内存

char *GetMemory3(int num)   
{   
    char *p = (char *)malloc(sizeof(char) * num);   
    return p; // 返回一个地址,地址是通过malloc而来的 函数返回后依然有效
}  
void Test3(void)   
{   
    char *str = NULL;   
    str = GetMemory3(100);  // str指向了返回的一个地址(通过malloc是有效的)
    strcpy(str, "hello");   
    printf("%s\n", str);
    free(str);   
} 

字符串:栈

char *GetStr()   
{   
    char p[] = "hello"; // "hello"在栈上
    return p; // 返回一个地址,地址栈上的,函数返回后栈被回收了
}  
void Test4(void)   
{   
    char *str = NULL;   
    str = GetStr();  // str会指向一个不知道的地址  
    printf("%s\n", str); // 垃圾内容,不是hello
} 

字符串:常量区

char *GetStr2()   
{   
    char *p = "hello"; // "hello"在常量区, 静态区,只读的,生命周期不变
    return p;
}  
void Test5(void)   
{   
    char *str = NULL;   
    str = GetStr2(); // 始终得到的是同一个常量字符串
    printf("%s\n", str); // hello
} 

更多参考
找工作笔试面试那些事儿(3)—内存管理那些事
http://www.lai18.com/content/1989888.html

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值