指针操作动态内存

缺乏、安全感 2022-06-07 10:52 274阅读 0赞

因为指针“可变”的特性,常用它操作动态内存。

1,如何通过指针来申请动态内存?

如果函数的参数是一个指针,是否能通过这个参数获取到期望的内存?

  1. void getMemory(char *p, int num){
  2. p = (char*)malloc(sizeof(char) * num);
  3. }
  4. void testGetMem(){
  5. char *str = NULL;
  6. getMemory(str,10);
  7. strcpy(str,"abcdefg");
  8. cout << "test:"<< str <<endl;
  9. }

上面的代码编译不会有问题,但是运行会报:Segmentation fault (core dumped),段错误,也就是strcpy(str,”abcdefg”);出现了非法的地址操作。

所以不能指望通过函数的指针参数,申请动态内存。原因是在getMemory中,编译器总是要为函数的每个参数生成临时副本,指针参数p的副本是_p,编译器是_p=p,函数体中的程序修改_p的内容,会导致p的内容也被改变,这是可以用指针作为输出参数的原因。在上面的代码中,_p申请了新的内存,所以把_p所指向的内存地址改变了,但是p没有任何变化,所以getMemory没能输出任何东西,并且这个函数被执行时,会引起内存泄露,因为没有用free释放内存。

基于前面说的,可以通过指针参数,改变指针的内容,那么如果指针的内容也是一个指针,就应该可以通过这个内容(指针)得到申请的动态内存了,这就是用指向指针的指针作为参数。

  1. void getMemory(char **p, int num){
  2. *p = (char*)malloc(sizeof(char) * num);
  3. }
  4. void testGetMem(){
  5. char *str = NULL;
  6. getMemory(&str,10);
  7. strcpy(str,"abcdefg");
  8. cout << "test:"<< str <<endl;
  9. }

注意如果参数是指向指针的指针,那么在调用getMemory时,传入的&str。

提示一点malloc使用时要做类型转化,因为malloc返回的是void *类型。

还有一种更简单的方法,就是通过返回值传递动态内存:

  1. char *getMemory(int num){
  2. char *p = (char*)malloc(sizeof(char) * num);
  3. return p;
  4. }
  5. void testString(){
  6. char *str = NULL;
  7. str = getMemory(10);
  8. strcpy(str,"abcdefg");
  9. cout << "test:"<< str <<endl;
  10. }

值得注意的是不能用return返回指向栈内存的指针,如下函数就得不到期望的值:

  1. char *getMemory(int num){
  2. char p[] = "abcd";
  3. return p;
  4. }
  5. void testString(){
  6. char *str = NULL;
  7. str = getMemory(10);
  8. //strcpy(str,"abcdefg");
  9. bool ret = (str == NULL)? true:false;
  10. cout << "test,ret="<< ret << ",str="<<str <<endl;
  11. }

结果显示:test,ret=1,str=,

str还是null,因为函数内的变量是在栈内存空间的,这段内存在函数结束后自动消亡。

发表评论

表情:
评论列表 (有 0 条评论,274人围观)

还没有评论,来说两句吧...

相关阅读

    相关 动态2(动态数组)

    在 c++11 中提供了两种一次分配一个对象数组的方法。其一是使用一种 new 表达式语法,其二是使用一个名为 allocator 的类。虽然通常我们更希望用容器来代替数组(使

    相关 12 c++ 动态

    内存 // 静态内存:保存 static数据 和 全局变量 等 // 栈内存:保存局部变量 // 堆内存(动态内存):程序运行时分配的对象

    相关 C++ 传递动态

    这部分内容在[引用作为函数的参数][Link 1]这个blog中有一些涉及,为了讨论引用传递顺带了参数传递与指针传递,在这里从动态内存传递的角度梳理一下,先看这样一个题目:

    相关 指针操作动态

    因为指针“可变”的特性,常用它操作动态内存。 1,如何通过指针来申请动态内存? 如果函数的参数是一个指针,是否能通过这个参数获取到期望的内存? void