关于结构体指针段异常的有关问题

关于结构体指针段错误的问题
本帖最后由 qq_28839381 于 2015-07-22 12:04:35 编辑
#include "stdio.h"

struct node
{
char *p;
};

int main(void)
{
struct node *a = (struct node *)malloc(sizeof(struct node));
a->p = "hello"; 
//strcpy(a->p, "hello");
printf("%s\n", a->p);
return 0;
}

这样运行正常,打印hello,但将a->p = "hello"替换成strcpy(a->p, "hello");会发生段错误,请问这是什么原因?
------解决思路----------------------
p本来没有存储空间
a->p = "heo"; 
是将p指向  字符串常量 “heo”的内存空间,是正确的

strcpy(a->p, "hello");
是将“hello”  赋值到p指向的内存空间,应为没有,所以出错

你可以改为
int iLen = sizeof("hello");
 a->p = new char[iLen];
memset(a->p,0,iLen) ;
strcpy(a->p, "hello");
printf("%s\n", a->p);
if(a->p != NULL)
{
delete [] a->p;
a->p = NULL;
}
return;

------解决思路----------------------
strcpy字符串复制。。。。p没有内存空间,复制不进去。。
------解决思路----------------------
可以给p     malloc一下试试
------解决思路----------------------
崩溃的时候在弹出的对话框按相应按钮进入调试,按Alt+7键查看Call Stack即“调用堆栈”里面从上到下列出的对应从里层到外层的函数调用历史。双击某一行可将光标定位到此次调用的源代码或汇编指令处,看不懂时双击下一行,直到能看懂为止。

------解决思路----------------------
lz的过程好像是构造函数的工作关于结构体指针段异常的有关问题
------解决思路----------------------
p没分配内存。肯定错误。
a->p = "hello"; 是让p指向hello的内存地址。并不是p自己内存块。
------解决思路----------------------
在strcpy前加一句 a->p=(char*)malloc(sizeof(char*));
------解决思路----------------------
你用动态内存分配函数定义了一个node指针a,但是没有赋予初值,所以a指针是没有指向任何实际的内存空间。如果用strcpy(a->p, "hello"),表示将hello字符串复制至P所指向的内存空间,由于P并没有赋予初值,所以报错。