3

このコードは正常にコンパイルされますが、実行中にセグメンテーション違反エラーが発生しますか? 誰でも理由がわかりますか?

#include <stdio.h>
#include <string.h>
#include <math.h>

int main() {
    const char s2[] = "asdfasdf";
    char* s1;

    strcpy(s1, s2);
    printf("%s", s1);

    return 0;
}
4

8 に答える 8

13

単一のポインタ,s1にスペースを割り当てましたが、 が指すバイトには割り当てていませんs1

解決策は、メモリを動的に割り当てることですs1

s1 = (char *)malloc(strlen(s2) + 1);
strcpy(s1, s2);

最後に暗黙のバイトがあるためmalloc、文字数よりも1 バイト多いメモリ ( への呼び出しの +1) を割り当てる必要があることに注意してください。s2NULL

詳細については、 C メモリ管理 (スタック オーバーフロー)を参照してください。

于 2009-08-18T16:47:18.173 に答える
4

s1 にメモリを割り当てていません。s1 へのポインターがありますが、s2 の値をコピーするための strcpy に割り当てられたメモリがありません。

char *s1 = malloc( strlen(s2) + 1 );

strcpy( s1, s2 );
于 2009-08-18T16:47:06.910 に答える
3

s1 にメモリを割り当てていません。それは何もないことへのポインタです。

char* s1 = malloc(sizeof(s2));
strcpy(s1, s2);
printf("%s", s1);
free(s1);
于 2009-08-18T16:47:48.033 に答える
2

彼ら全員が言ったことは、あなたはs1のためにスペースを割り当てる必要があります。他のすべての人が投稿したものは問題なく機能しますが、既存の文字列にスペースを割り当てて新しいポインタにコピーする簡単な方法が必要な場合は、次のようにstrdupを使用します。

#include <stdio.h>
#include <string.h>
#include <math.h>

using namespace std;

int main() {
    const char s2[] = "asdfasdf";
    char* s1;

    s1 = strdup(s2);
    printf("%s", s1);

    return 0;
}

誰かが以前にstrdupについて言及しました、それはそれを使用する方法でしょう。これは標準のCライブラリにあるため、ほとんどのシステムでサポートされているはずです。しかし、どうやらそうでない人もいます。したがって、エラーが返された場合は、すでに説明した方法を使用して独自に作成するか、すでに説明した方法を使用してください;)

于 2009-08-18T16:59:49.803 に答える
2

この問題に対処するための strdup (String Duplicate) の可能性を指摘した人はまだいません。

#include <stdio.h>
#include <string.h>
#include <math.h>

using namespace std;

int main() {
    const char s2[] = "asdfasdf";
    char* s1;

    s1 = strdup(s2);  // Allocates memory, must be freed later.
    printf("%s", s1);

    free(s1);         // Allocated in strdup, 2 lines above
    return 0;
}
于 2009-08-18T17:05:09.170 に答える
2

問題は、s1 に関連付けられたメモリがないことです。strcpy呼びませんmalloc()

次のいずれかを実行できます。

char s1[10];

また

char *s1 = malloc(10);

于 2009-08-18T16:47:38.313 に答える
1

宛先を割り当てる必要があります ( using namespace std;C ではなく C++ であり、残りのコードは C です)。

于 2009-08-18T16:47:33.260 に答える
0

ポインタ s1 にメモリを割り当てる必要があります。そうしないと、未知の場所を指しているため、セグメンテーション違反に到達します。正しいコードは次のとおりです。

#include <stdio.h>
#include <string.h>
#include <math.h>

int main() {
    const char s2[] = "asdfasdf";
    char* s1 = malloc(21 * sizeof(s2[0]));
    strcpy(s1,s2);
    printf("%s",s1);
    return 0;
}
于 2009-08-18T16:49:57.653 に答える