内存申请

C语言 码拜 10年前 (2015-05-11) 1415次浏览 0个评论

题目是让看程序有错误吗
仅凭我现在的零碎知识看
#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
void func(char *p)
{
p=(char *)malloc(sizeof(char)); //  申请内存,但是却没有说明具体大小,是不可以的吧?
}

int main(int argc,char *argv[])
{
char *s=NULL;
func(s);
strcpy(s,”i love xiyou_linux”);//我觉得这里也有问题吧,这意思九是复制到首地址里了吧?
puts(s);
return 0;
}

自己编译运行之后,是段错误

5分
void func(char *p) //指针不能回传 改为char *&p
{
p=(char *)malloc(sizeof(char)); //  只分配了一个字节
}
15分
解释如下:

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
void func(char *p)
{
	//这里只申请了一个字节 sizeof(char) = 1
	p = (char *)malloc(sizeof(char)); //  申请内存,但是却没有说明具体大小,是不可以的吧?
}
int main(int argc, char *argv[])
{
	char *s = NULL;
	func(s);   //实参与形参的问题,s还是NULL,所以下一句出错
	strcpy(s, "i love xiyou_linux");//我觉得这里也有问题吧,这意思九是复制到首地址里了吧?
	puts(s);
	return 0;
}
15分
一种可能的修改:

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
void func(char **p)  //更改普通变量的值,使用一级指针;更改一级指针的值,使用二级指针
{
	*p = (char *)malloc(sizeof(char)*20);  //分配20个字节
}
int main(int argc, char *argv[])
{
	char *s = NULL;
	func(&s);   //传入变量的地址
	strcpy(s, "i love xiyou_linux");
	puts(s);
	return 0;
}
引用 2 楼 zhangxiangDavaid 的回复:

解释如下:

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
void func(char *p)
{
	//这里只申请了一个字节 sizeof(char) = 1
	p = (char *)malloc(sizeof(char)); //  申请内存,但是却没有说明具体大小,是不可以的吧?
}
int main(int argc, char *argv[])
{
	char *s = NULL;
	func(s);   //实参与形参的问题,s还是NULL,所以下一句出错
	strcpy(s, "i love xiyou_linux");//我觉得这里也有问题吧,这意思九是复制到首地址里了吧?
	puts(s);
	return 0;
}

所以,改正的话是
1.自定义函数func里为p申请较大的内存空间
2.再在main函数里为s申请内存

不过这样func不就没有什么用了吧

引用 3 楼 zhangxiangDavaid 的回复:

一种可能的修改:

#include<stdio.h>
#include<malloc.h>
#include<string.h>
#include<stdlib.h>
void func(char **p)  //更改普通变量的值,使用一级指针;更改一级指针的值,使用二级指针
{
	*p = (char *)malloc(sizeof(char)*20);  //分配20个字节
}
int main(int argc, char *argv[])
{
	char *s = NULL;
	func(&s);   //传入变量的地址
	strcpy(s, "i love xiyou_linux");
	puts(s);
	return 0;
}

谢谢谢谢
自己想的太简单了
看来我真的还需要好好学习
要学的东西还好多呢

5分
Windows:
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。

Linux:
进程意外退出会在当前目录下产生‘core’文件或形如‘core.数字’的文件比如‘core.1234’
使用命令
gdb 运行程序名 core或core.数字
进入gdb然后使用bt命令
可以查看进程意外退出前函数调用的堆栈,内容为从上到下列出对应从里层到外层的函数调用历史。
如果进程意外退出不产生core文件,参考“ulimit -c core文件最大块大小”命令


CodeBye 版权所有丨如未注明 , 均为原创丨本网站采用BY-NC-SA协议进行授权 , 转载请注明内存申请
喜欢 (0)
[1034331897@qq.com]
分享 (0)

文章评论已关闭!