我有以下两个版本的代码
正确的工作程序
#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
的两种不同行为。
请帮忙。
答案 0 :(得分:0)
您的计划的任何部分都不正确。不得修改包含字符串文字的内存,因此您不得复制到p
位置。
您必须只能访问自己获得的内存供您自己使用,例如:
char p[500];
strncpy(p, "+\0", 2); // OK, *p is yours
答案 1 :(得分:0)
我相信你实际上是指p == NULL
(来自你的评论)
*p == NULL
只表示p
指向某个包含值0
的地址。
换句话说,*p == NULL
和p == NULL
是完全不同的两件事。
因此,如果您尝试编辑p
所指向的内存,并且该内存为地址0x0000
(也称为NULL
),则几乎可以保证失败,因为您可能没有这种记忆。
当我说自己的时候,我的意思是你的程序在这个位置分配了内存。如果你写char *p = new char;
,那么你的程序会分配一些sizeof(char)
字节的内存。现在,如果您修改*p
的值,那是可以的,因为您已经给予内存(通过操作系统或其他)。