(悬赏20分)以下C++程序运行的结果是什么,为什么? c++程序算出来结果有问题

作者&投稿:柯薛 (若有异议请与网页底部的电邮联系)
第一个程序错误处:GetMemory()传进去的是指针副本,要做出参要传二级指针。所以str一直是NULL。对NULL指针的操作是非法的。

第二个程序错误处:由于p是局部指针,返回局部指针或引用会导致指针失效。指针的值会复制,但是指针本身出了函数范围就析构掉了。
第三个符合:传的是二级指针,所以指针可以带值出来。这就是出参。
第四个输出的是:world。虽然free了但是这个指针只是被清空,free还是要调用delete,delete后没有立即指向NULL,所以free后的指针暂时可用,但是这种用法是不安全的。记得采纳呀。

第一个:因为子函数GetMemory()没有return语句,即子函数的P的值没有传递给主函数的str,str仍然为NULL,故不能进行拷贝。

第二个:虽然有返回值,但子函数中定义的char p[] 是处在栈区的(malloc开辟的空间在堆区,需要自己用free释放)子函数结束后,该空间就被释放掉了。即str指向的空间没有实际值。
第三个:虽然也没有返回指,但函数调用时,是指针传递,子函数的P是str的地址,即*P就是str,它直接改变了str的值,完美的解决里第一个中的问题。所以是正确的。输出为hello

第四个:虽然malloc开辟出的空间被释放掉了,但str仍然指向这块地方。输出为world

程序一:出错原因应该是在栈区动态申请内存,无法追踪其释放过程
程序二:函数返回了局部变量的地址
程序三:函数的值传递和地址传递的区别
程序四:内存释放并不代表指针消亡,释放后需要程序员自己置空str=NULL;

#include <iostream>
#include <stdlib.h>
using namespace std;

/*
//程序1
void GetMemory(char **p) //改成这样就可以了
{
     *p = (char *)malloc(100);
}

int main()
{
    char *str = NULL;

    GetMemory(&str); //这里str根本就没有得到内存,因为只是修改了地址的值

    strcpy(str, "hello,world");
    cout << str << endl;

    free(str);
    str = NULL;
    return 0;
}
*/

/*
//程序二

char *GetMemory(void)
{
     static char p[] = "hello world"; //改成静态的基本可以解决问题,但是
//这样的话GetMemeory就没有什么意义了
     return p;
}
//可以这样修改
char *GetMemory2(void)
{
char *p = (char*)malloc(100);
strcpy(p, "hello,world");
return p;
}

int main()
{
    char *str = NULL;
   
// GetMemory函数里的p是个局部变量,经过赋值后就释放了,所以
// str指向的位置未知。

    str = GetMemory2();
    cout << str << endl;
free(str);
str = NULL;
    return 0;
}
*/

/*
//这个是正确程序
//程序三
void GetMemory(char **p, int num)
{
     *p = (char *)malloc(num);
}

int main()
{
    char *str = NULL;
   
    GetMemory(&str, 100);
    strcpy(str,"hello");
    cout << str << endl;
free(str);
    str = NULL;
    return 0;
}
*/



//程序四:
int main()
{
    char *str = (char *) malloc(100);
    
    strcpy(str, "hello");
    free(str);
    //释放内存之后还是把str=NULL;可以比较好的杜绝野指针

    if(str != NULL)
    {
           strcpy(str, "world");
           cout << str << endl;
    }
    
    return 0;
}

程序一和程序二是获得内存的两种方式,

毛病出在函数GetMemory 中。编译器总是要为函数的每个参数制作临时副本,指针

参数p 的副本是 _p ,编译器使  _p = p。如果函数体内的程序修改了_p的内容,就导致

参数p 的内容作相应的修改。这就是指针可以用作输出参数的原因。在本例中,_p申请

了新的内存,只是把_p所指的内存地址改变了,但是p 丝毫未变。所以函数GetMemory

并不能输出任何东西。(引用高质量C++编程指南中的一句话)讲的很清楚,希望能帮到你。



第一题:
指针本身是个地址,你可以把它看成一个int型,所以,函数内部分配的地址不可能通过int参数传递出去。
第二题:
数组是个局部变量,出了函数之后就自动释放了,所以有问题。
第三题:
双重指针作为函数参数的典型应用就是把函数内分配的内存传递出去。
第四题:
free之后的内存不更改再使用,那段代码是错误的。这个是典型的错误使用指针的情况。

c++语言中,(*p)[2]是什么意思,如程序,结果为10.20,30.为什么,要详细解释~

(*p)[2] 这种形式称之为“指向由m个元素组成的一维数组的指针变量”。
int main(){
int (*p)[3];
p=n; // 注意:这种写法导致p指向了n[0][0],即p指向了n的首元素
/*
p[0][0]:指向n的首元素 即10
*(p[0]+1):指向n的下标为0的行(即第一行),+1代表0行1列 即20
(*p)[2]:指向行序号为2的元素 即30,(*p)[3]行序号为3即40,(*p)[4]行序号为4即50,依此类推...
*/
cout<<p[0][0]<<","<<*(p[0]+1)<<","<<(*p)[2]<<endl;
return 0;
}

什么问题?以后贴代码不要贴图上来

C语言考试填空,急啊~~~高分悬赏~~据说是福建师范大学以前的试题,会的帮...
答:6.以下程序用来输出结构体变量ex所占存储单元的字节数,请填空。 struct st { char name[20]; double score; }; main() { struct st ex; printf("ex size: %d\n",sizeof(【 struct st 】)); } 7.以下程序运行后,显示:【 c=377 】main(){ float a=365.7189;int b=12,c;c=...

以下程序运行后,输出结果是( ) main() { char *s="abcde"; s+=2...
答:选择答案C,输出的为字符c的地址。因为%d是打印整形变量的值,因为前一句执行了s+=2,s指针偏移了两个位置,偏移了两个位置之后s指向的是字符c,所以输出语句输出的是指针s,而s存放的是地址,所以输出的就是字符c所在的地址。

C语言问题,分析以下程序的运行结果
答:include<stdio.h> main(){ char a='a',b='b';int p,c,d;p=a; //p取到字符'a'的asc码值,就是97 p=(p<<8)|b;//p<<左移操作左移8位就是把低八位清零了,再或上一个b,相当于p中的后十六位中前八位是a,后八位是b d=p&0xff;//p和ff与一下,就是把p的后八位值...

20分悬赏一到计算机的题(C语言)高手来帮忙,求你们了!!还有悬赏呢!
答:出点有水准的?ok?

一个c程序运行时占用的内存可能包含哪几部分
答:一个C程序在运行时,其占用的内存通常包括以下几个部分:栈空间(stack space):用于存储函数调用时的局部变量、参数和返回地址等信息。栈空间的大小由编译器自动分配,通常在程序运行时动态调整。堆空间(heap space):用于动态分配内存空间,程序员可以通过malloc、calloc等函数向堆中申请内存。堆空间的...

C语言程序运行结果题,一共五题,可以加分
答:程序运行结果如下:1、20 0 2、35 3、10 (备注:此问题语法与C语言不符,需要修改)4、 sum=13 5、8

1.以下程序的运行结果是 。 main( ) { int c,x,y; x=1; y=1; c=0...
答:2 1 1 因为这是短路逻辑,c=x++||y++,x++的值是1,所以||右侧的运算就不再进行了,y++等于没有执行,还是1。

c语言阅读下面的程序,写出程序运行输出结果
答:for循环循环3次,依次调用三次f(1),而f中的z和y是static静态变量,只初始化一次,而且在退出函数的时候还会保持它们的值。知道这个就可以走一次循环了:比如k=1,即f(1)开始x=1;z=3,y=0;y++;z++;//这行结束后y为1,z为4x+y+z=1+1+4=6;k=2,f(1)第二次调用x=1;z=4,y=1(...

一道C语言的题目,悬赏20分
答:abcdefgh ijkl mnop 定义的p是一个指针数组,puts(p[i]);则输出第i个指针所指地址中的元素。由于循环中只有三个,所以只输出二维数组中的前三行。

C语言:下列程序运行时若输入 1abcedf2df<回车>输出结果为( )
答:1AbCeDf2dF VC6.0执行试过了。include<stdio.h> main(){ char a=0,ch;while ((ch=getchar())!='\n'){ if(a%2!=0&&(ch>='a'&&ch<='z')) ch=ch-'a'+'A';a++;putchar(ch);} printf("\n");} //输入1abcedf2df 第一次 a=0那么根据ascii表查看是null也就是...