程序在字符指针赋值时给出错误值?

时间:2013-11-10 11:05:15

标签: c++

我有以下两个版本的代码

正确的工作程序

#include<iostream.h>
#include<string.h>

void main()
{

const char *q="+\0";
char *p=""; //working correct with ""
strncpy(p,q,2);
cout<<p;
}

程序给出错误

 #include<iostream.h>
 #include<string.h>

void main()
{

const char *q="+\0";
char *p=NULL; //Program gives error abnormal termination when *p=NULL or *p="\0"
strncpy(p,q,2);
cout<<p;
}

我不理解这些代码示例中char *p的两种不同行为。 请帮忙。

2 个答案:

答案 0 :(得分:0)

您的计划的任何部分都不正确。不得修改包含字符串文字的内存,因此您不得复制到p位置。

您必须只能访问自己获得的内存供您自己使用,例如:

char p[500];
strncpy(p, "+\0", 2);    // OK, *p is yours

答案 1 :(得分:0)

我相信你实际上是指p == NULL(来自你的评论)

*p == NULL只表示p指向某个包含值0的地址。

换句话说,*p == NULLp == NULL是完全不同的两件事。

因此,如果您尝试编辑p所指向的内存,并且该内存为地址0x0000(也称为NULL),则几乎可以保证失败,因为您可能没有这种记忆。

当我说自己的时候,我的意思是你的程序在这个位置分配了内存。如果你写char *p = new char;,那么你的程序会分配一些sizeof(char)字节的内存。现在,如果您修改*p的值,那是可以的,因为您已经给予内存(通过操作系统或其他)。