0

私の本には、文字列(2つのポインター)をコピーする方法の例があります。コード全体をコピーしましたが、ターミナルでプログラムを起動すると、「セグメンテーション違反(コアダンプ)」と表示されます>。<

このコードの何が問題になっていますか?:

#include <iostream>
#include <string>

using namespace std;


void cpy(char* p,const char* q){

    while(*p++ = *q++) ;
}

int main(){

    char* hello;

    cpy(hello, "Whazzap");

    return 0;
}
4

2 に答える 2

4

初期化されていない変数 (この場合はポインター)の値を使用しているため、プログラムにはUndefined Behaviorがあります。hello

おそらくhello、文字の配列になるつもりでした。その場合は、次のように宣言します。

char hello[SIZE];

どこSIZEにコピーしたいすべての文字を配列が保持できるかを確認するのに十分な大きさのコンパイル時定数です。文字列リテラルで配列を初期化するだけの場合は、次のように簡単に実行できます。

char hello[] = "Whazzap";
于 2013-03-15T18:14:01.627 に答える
4

ポインタhelloが初期化されていません。これは、関数で書き込もうとするランダムなメモリ位置を指していることを意味しcpyます。基本的に、許可されていない場所に書いています。

配列を作成してコピー用のスペースを割り当てる必要がありcharますが、文字列全体をコピーするのに十分なスペースがあることを確認する必要があります。

学習しているように見えるので、このアプローチには危険が伴うことを指摘しておきます。何をするにしても、作成したストレージの境界を超えて書き込みをしないようにする必要があります。C++ 標準ライブラリには、この種の問題を安全に処理するための便利なクラスが用意されているため、これは学習プロセスの一部に過ぎず、実際のプログラミングでは行うべきではありません。

于 2013-03-15T18:15:05.147 に答える