指针-一个动态内存分配的问题,函数执行后p指向哪里?

问题描述

一个动态内存分配的问题,函数执行后p指向哪里?

一下是我的代码:

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>

char *strcnp(char *sd,char *ds)
{
        char *q=sd;

        while((*ds++=*sd++)!='')
        NULL;
        return q;
}

int main()
{

        char *a[4]={"abc","def","whf","where"};
        printf("%d,%dn",sizeof(a),sizeof(a[3]));
        char *p=NULL;
          p=(char *)malloc(strlen(a[0])+1);//若无此句,运行出现段错误
        strcnp(a[0],p); //此句执行过后,p指向哪里?
        printf("%sn",p);
        free(p);
        return 0;
}

解决方案

p根本没有变,因为你的strcnp只能修改指针指向的内容,而不能修改指针本身地址。如果你想修改p的地址,需要传递char**

解决方案二:

strcnp(a[0],p); //是函数传参,传递的是指针P存储的数值,也就是动态开辟的内存空间首地址,这样strcnp()处理的是指针P指向的内存空间。
不过函数参数传递,要么是通过寄存器,要么是通过函数堆栈,这里a[0],p是通过寄存器传参,也就是拷贝变量P的数值到寄存器,程序由主程序跳转到子函数strcnp()后,取相应寄存器数值赋值给堆栈上临时指针变量ds,指针后移的一直是堆栈上新开辟的临时变量ds,而不是P,P的数值一直未变。

解决方案三:

疑问主要在*ds++这里,ds自增不是使得ds后移么,后移之后为什么还指向分配内存的首地址呢?迷糊了

解决方案四:

以下是我更改代码做的输出:

 #include<stdio.h>
#include<stdlib.h>
#include<string.h>

char *strcnp(char *sd,char *ds)
{
        char *q=sd;
        //ds=(char *)malloc(strlen(sd)+1);
        while((*ds++=*sd++)!='')
        printf("while dizhi:%dn",ds);
        return q;
}

int main()
{

        char *a[4]={"abc","def","whf","where"};
        printf("%d,%dn",sizeof(a),sizeof(a[3]));
        char *p=NULL;

        p=(char *)malloc(strlen(a[0])+1);//若无此句,运行出现段错误

        printf("qian dizhi:%dn",p);
        strcnp(a[0],p);
        printf("hou dizhi:%dn",p);
        printf("%sn",p);
        free(p);

        char *q=a[3];
        printf("%sn",q);
        return 0;
}

输出结果:

 16,4
qian dizhi:152453128
while dizhi:152453129
while dizhi:152453130
while dizhi:152453131
hou dizhi:152453128
abc
where

可见在函数strcnp内,ds的值是改变的,但是函数strcnp执行完p的指向不变,这是为什么,传参只是一份拷贝究竟是神马依稀?

解决方案五:

可不可以这样理解:传地址调用是一种特殊的传值调用,函数形参传递的只是实参值的一份拷贝;由于实参的值是个地址,因此对形参的操作会改变实参所指向变量的值,同时也是形参所指向变量的值

时间: 2024-09-21 20:40:29

指针-一个动态内存分配的问题,函数执行后p指向哪里?的相关文章

动态内存分配的C代码示例

概述 之前有同学在QQ上问我,C语言中的动态内存分配是怎么回事. 首先,我们来看看内存分配的概念,它是指在程序执行的过程中分配或者回收存储空间的方法.一般说来,内存分配方法分为静态内存分配和动态内存分配两种.在本文中,我们主要讨论动态内存分配. 要实现动态内存分配,就需要有执行这个操作的对象.C语言考虑得很周到,它为我们提供的两个标准库函数:malloc和free. malloc和free函数简介 malloc函数 原型:void *malloc(size_t size); 简介:该函数在内存的

函数参数传递和动态内存分配的问题

问题描述 函数参数传递和动态内存分配的问题 利用下面这段代码进行动态内存分配有什么问题: char *getmemory(int sum) { char *p=NULL; p=(char *)malloc(sum); return p; } int main() { char *str=NULL; str=getmemory(100); strcpy(str,"hello c!"); printf("%sn",str); } 解决方案 你的主程序需要释放内存,否则可

C语言 动态内存分配的详解及实例_C 语言

1. 动态内存分配的意义 (1)C 语言中的一切操作都是基于内存的. (2)变量和数组都是内存的别名.     ①内存分配由编译器在编译期间决定     ②定义数组的时候必须指定数组长度     ③数组长度是在编译期就必须确定的 (3)但是程序运行的过程中,可能需要使用一些额外的内存空间 2. malloc 和 free 函数 (1)malloc 和 free 用于执行动态内存分配的释放 (2)malloc 所分配的是一块连续的内存 (3)malloc 以字节为单位,并且返回值不带任何的类型信息

指针-c++对象内存分配的问题,如何确定在堆上还是在栈上?

问题描述 c++对象内存分配的问题,如何确定在堆上还是在栈上? c++中对象内存放堆上还是在栈上是不是根据对象实例化的方法,如: A a; //在栈中分配内存 A * a = new A(); //动态内存分配,在堆上 要是这样,如果我尽量不用指针的话(这样程序风格似乎更加清晰一些),那是不是对象都分配到栈上了?这有什么弊端吗?栈的空间是不是很有限?是不是为了栈空间的问题我们必须尽量多用new分配内存呢?类成员是不是也要多用指针呢? 解决方案 经过昨晚大家的热心帮助,对该问题的疑问已经烟消云散,

c++中 类 指针数组 动态内存

问题描述 c++中 类 指针数组 动态内存 小白问题 关于类的指针数组中 动态内存分配问题 如何来运用 求讲解 解决方案 看看这文章http://blog.csdn.net/lanbing510/article/details/8112786 解决方案二: 你应该属于初学者,应该多看书,多编写程序,验证自己的思想,这才会进步的快,对于参考书,你可以参考这里让你走上牛人的C++学习书籍推荐,半年后你就会觉得你问的问题根本不叫问题,对于动态内存,你可以参考指针参数是如何传递内存的?和既然有了mall

(一四二)继承和动态内存分配

当基类.派生类用,或者不用动态内存时,共有四种情况: (注意,前提是基类的动态内存分配相关函数符合常规使用动态内存的要求)   情况一:基类 使用 动态内存分配.派生类新增数据成员 不使用 动态内存分配 假如基类使用动态内存分配(new),其必然设定①构造函数.②复制构造函数.③赋值运算符.④析构函数. 又知,派生类的构造函数(包括默认构造函数),需要调用基类的构造函数. 那么基类的数据成员若使new,则已经没问题. 派生类新增的数据成员,由于不使用new,因此可以按值传递.   ①对于派生类构

ajax-jQuer easyui里怎么在一个请求的回调函数执行后再处理接下来的操作

问题描述 jQuer easyui里怎么在一个请求的回调函数执行后再处理接下来的操作 $("#pandv").treegrid('expand',parentID); if($("#pandv").treegrid('getChildren',parentID).length!=$("#pandv").treegrid('find',parentID).versionCount){ if(!$("#pandv").treegr

C++语言之动态内存分配

在C语言中,我们熟悉的内存分配与释放的最常用的接口分别是malloc , free .在C++中:     存在着更加方便的动态存储分配: 1.new 和delete 机制,new 它能更可靠控制存储区的分配,C++ 用delete 释放new 运算符申请的存储区. 2.new 分配空间时, 如果是对象, 自动调用构造函数. 3.new [] 表示分配一个动态数组, 要跟delete [] 配合使用. 直接上代码: #include <iostream> using namespace std

增加一个判断内存变量存在的函数

变量|函数   笔者在开发应用系统中曾经用FoxPro的on error语句编写了一个判断内存变量的函数Exist(),非常方便实用,在此介绍给大家. 设计思路:先假设内存变量存在,然后将待判断的内存变量赋值给一个临时变量,若该内存变量不存在,则执行时必将出错,出错时将执行on error语句,只要在on error处理的函数中修改内存变量存在与否的标志即可.为了不影响调用程序的错误处理,保证该函数的通用性,在函数执行前后必须保存和恢复调用程序可能的错误处理. 源程序如下: ***EXISTP