c语言给指针分配内存空间,c语言-指针-分配内存和赋值需要注意的

每次使用指针都会遇到大大小小的问题,每次都要翻开资料琢磨错在哪,寻根究底还是对指针还是没有完全掌握。本文为了加深映像,避免以后犯类似的错误,特地做了一些实验。

1.字符串指针变量赋值

#include

int main(){

char *b="azzzxxxddd";

b="azzzxxxdddccccc";

printf("%s", b);

system("pause");

return 0;

}

结果:没有报错,b赋值成功,正常输出。

原因分析:这里为什么没有内存溢出呢,原因是初始化b指针的时候将b指向了字符串常量"azzzxxxddd"的首地址,再次赋值"azzzxxxdddccccc"时,又将b指向了字符串常量"azzzxxxddd"的首地址,无论字符串长度怎么增加都不会内存溢出,可见初始化b的时候并没有分配内存,只是做了指向动作。

2.字符串指针变量分配动态内存和赋值

2.1

#include

#include

int main(){

char *b=(char*) malloc(5*sizeof(char));

strcpy(b, "abcdefghids");

printf("%s", b);

system("pause");

return 0;

}

结果:没有报错,b赋值成功,正常输出。

原因分析:这里为什么没有内存溢出呢,原因是虽然b指针指向了一段拥有5字符内存空间,但是恰好顺序下来的空间没有填满,所以后面的字符能装下。现在把这个字符串扩充至5000字节赋值再次运行,结果内存溢出报错。

2.2

int main(){

char *a="aaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaaa";

char *b=(char*) malloc(5*sizeof(char));

b = a;

printf("%s", b);

system("pause");

return 0;

}

结果:没有报错,b赋值成功,正常输出。

原因分析:这里为什么没有内存溢出呢,原因是虽然b指针指向了一段拥有5字符内存空间,但是第二次赋值指针b指向了a指针所指向的地址,原来给b分配的内存空间没有使用。现在把a指向的字符串扩充至5000字节再次运行,依然没有报错,再次证明了这一点,也说明了直接赋值和使用strcpy函数赋值的区别。

2.3

int main(){

char a[20]="aaaaaaaaaaaaaaaaa";

char *b=(char*) malloc(5*sizeof(char));

b = &a;

printf("%s", b);

system("pause");

return 0;

}

结果:没有报错,b赋值成功,正常输出。

原因分析:道理同2.2,只是把字符串常量放入了数组,再另b指向数组a的首元素地址。

2.4

int main(){

char a[20]="aaaaaaaaaaaaaaaaa";

char *b=(char*) malloc(5*sizeof(char));

strcpy(b,  a);

printf("%s", b);

system("pause");

return 0;

}

结果:没有报错,b赋值成功,正常输出。

原因分析:道理同2.1,把数组a改为5000容量,内放5000字符会内存溢出报错。

总结 :指针变量初始化赋值或直接赋值不会分配内存空间,赋值也只是改变了指针的指向,经过malloc动态分配内存后指针会指向一段连续的未被使用的内存空间,如果此时再使用直接赋值,指针就会指向新赋值的字符串首地址而放弃指向原来的分配空间,如果是用strcpy函数,它会将第二个参数填至指针指向的新内存空间,这是需要注意的。

  • 10
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
在 C 语言中,可以使用 `malloc` 函数为二级指针分配内存空间,具体步骤如下: 1. 定义一个指向二级指针指针,例如 `char **pp`。 2. 使用 `malloc` 函数为指针 `pp` 分配内存空间空间的大小应该足够存放一个指向指针指针,即 `sizeof(char*)`。 3. 使用 `malloc` 函数为指针 `*pp` 分配内存空间空间的大小应该足够存放需要存储的数据。 4. 对指针 `*pp` 进行赋值操作,即将需要存储的数据保存到指针 `*pp` 指向的内存空间中。 示例代码如下: ```c #include <stdio.h> #include <stdlib.h> int main() { char **pp = NULL; int rows = 2, cols = 4; int i, j; // 为二级指针分配内存空间 pp = (char**)malloc(rows * sizeof(char*)); if (pp == NULL) { printf("Failed to allocate memory for pp!\n"); exit(1); } // 为每个指针分配内存空间 for (i = 0; i < rows; i++) { pp[i] = (char*)malloc(cols * sizeof(char)); if (pp[i] == NULL) { printf("Failed to allocate memory for pp[%d]!\n", i); exit(1); } } // 对每个指针进行赋值操作 for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { pp[i][j] = 'A' + i * cols + j; } } // 输出每个指针指向的数据 for (i = 0; i < rows; i++) { for (j = 0; j < cols; j++) { printf("%c ", pp[i][j]); } printf("\n"); } // 释放内存空间 for (i = 0; i < rows; i++) { free(pp[i]); } free(pp); return 0; } ``` 在上述示例代码中,我们首先定义了一个指向二级指针指针 `pp`,然后使用 `malloc` 函数为指针 `pp` 分配了两个指针内存空间,即 `char*` 类型的指针。接着,使用 `for` 循环为每个指针分配了长度为 `cols` 的内存空间,并对每个指针进行赋值操作。最后,使用 `for` 循环输出了每个指针指向的数据,并在程序结束之前释放了所有分配内存空间
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值