ing 发表于 2020-3-7 20:34

C动态分配内存

本帖最后由 ing 于 2020-3-7 21:21 编辑

为什么指针变量 a 需要动态分配内存,temp 却不需要?


如果我不为指针 a 分配内存,那么将会导致异常的发生

uninitialized local variable 'a' used

你与明日 发表于 2020-3-7 20:38

本帖最后由 你与明日 于 2020-3-7 20:41 编辑

char **a =nullptr;//能编译通过,但不会分配内存给你,指针类型的数据都是需要给他一个内存地址

temp的内存地址是来自char **a

nstar1221 发表于 2020-3-7 20:46

malloc是在堆中申请空间,char** a是指向申请的空间的首地址,char** temp同样也是个指针,指向访问地址。
也就是说a是用于读写申请空间的,你给他换个别的名字也一样,只要有空间就可以往里面放数据

古月不傲 发表于 2020-3-7 20:58

这样能编译通过? 2级指针怎么能直接分配值
const char **a = (const char**)malloc(3 * sizeof(const char*));
                int n = 3;

                a = "qwer";
                a = "asdf";
                a = "zxcv";

                for (int i = 1; i < n; i++)
                {
                        for (int j = 1; j < n; j++)
                        {
                                if (a < a)
                                {
                                        const char *temp = a;
                                        a = a;
                                        a = temp;
                                }
                        }
                }

hlrlqy 发表于 2020-3-7 21:17

temp只是一个指针,这个指针编译的时候就已经在堆栈中存着了,他只是一个指向其他变量的指针,你分配内存返回的也是指针,声明指针变量编译器给你管理的,不要跟手动申请的内存空间混淆

叮咚歌 发表于 2020-3-7 21:18

干嘛用二级指针, 弄的复杂. 看提示,好像是a地址是不定的.因为a内存有编译器为其分配地址, 而a即a内存没有存放任何a信息.

ing 发表于 2020-3-7 21:30

古月不傲 发表于 2020-3-7 20:58
这样能编译通过? 2级指针怎么能直接分配值
const char **a = (const char**)malloc ...
感谢提醒,但确实可以编译运行,不过为什么这里 malloc(3 * sizeof(const char*));
可以存储"qwer"4个字符
a = "q";
a = "w";
a = "e";
a = "r";

他不是类似这样的吗
a

叮咚歌 发表于 2020-3-7 21:35

你是怎么编译通过的, char** a 被(char * ) 赋值.第一个连编译都不用,就提示你不行.

古月不傲 发表于 2020-3-7 21:41

ing 发表于 2020-3-7 21:30
感谢提醒,但确实可以编译运行,不过为什么这里 malloc(3 * sizeof(const char*));
可以存储"qwer"4个 ...

const char **a = (const char**)malloc(3 * sizeof(const char*));
a的地址 假设 = 0x0142D2E8
0x0142D2E8:48 9b 54 00 50 9b 54 00 58 9b 54 00

a = 0x00549b48:qwer....
a = 0x00549b50:asdf....
a = 0x00549b58:zxcv....
页: [1]
查看完整版本: C动态分配内存