-1

次の2つのバージョンのコードがあります

正しく動作するプログラム

#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 つの異なる動作を理解できません 。助けてください。

4

2 に答える 2

0

プログラムのどの部分も正しくありません。文字列リテラルを含むメモリは変更してはならないため、絶対にその場所にコピーしないでくださいp

次のように、自分で使用するために個人的に取得したメモリにのみアクセスする必要があります。

char p[500];
strncpy(p, "+\0", 2);    // OK, *p is yours
于 2013-11-10T11:06:53.220 に答える
0

私はあなたが実際にいつ意味していると信じていますp == NULL(あなたのコメントから)

*p == NULLjust はp、値を保持するアドレスを指すことを意味します0

つまり*p == NULL、 とp == NULLはまったく別のものです。

そのため、メモリ where がp指すメモリを編集しようとした場合、そのメモリはアドレス0x0000(としても知られるNULL) であり、このメモリを所有していない可能性が高いため、失敗することがほぼ保証されています。

私が自分自身と言うとき、私はあなたのプログラムがこの場所にメモリを割り当てたことを意味します。書き込むと、プログラムは数バイトのメモリをchar *p = new char;割り当てます。そして、(オペレーティングシステムなどによって) メモリが与えられているので、そのsizeof(char)値を変更しても問題ありません。*p

于 2013-11-10T11:29:41.817 に答える