0

私はいくつかのコードをプログラミングしていましたが、この問題に遭遇しました。2 つの配列を宣言しました。1 つの配列は start と呼ばれ、文字列 hello に初期化されます。2 番目の配列は user と呼ばれ、for ループで_として宣言されることになっています。ただし、start という配列が変更されるため、出力は次のようになります。

Printed word: Hello

Array Length: 5

_____o

開始配列が書き換えられるのはなぜですか? これが私が自分で学んでいる初心者の質問である場合は申し訳ありません。

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

int main(void)
{   
    size_t length = 0;
    char start [] = {"Hello"};
    printf("\nPrinted word: %s\n", start);
    length = strlen(start);
    printf("Array Length: %zi\n", length);

    char user[] = {0};

    for(size_t x = 0; x < length; x++){   //starting here
        user[x] = '_'; 
    }

    printf("%s\n",start);
}
4

2 に答える 2

3

配列に部屋を割り当てていませんuser。イニシャライザ値を 1 つだけ指定するため、長さは 1 です。したがって、それに書き込むと、範囲外になり、他の変数が使用するメモリにオーバーフローします。

また、引用符で囲まれた文字列の場合、中括弧は必要ありません。次のようにする必要があります。

const char start[] = "Hello";

また

const char *start = "Hello";

最後に、ループが適切に終了しない余地があったとしても、0 で終了する文字列を期待するuser後続のprintf()withは、未定義の動作を呼び出します。%s

于 2013-04-30T09:40:22.563 に答える
1

userchar配列は、この定義でサイズ= 1で定義されています

char user[] = {0};

上記の定義は、char 配列に 0 の要素が 1 つ含まれていることをuser意味します。このような配列の宣言は、配列のサイズがuser宣言に入れられた要素の数から推定されることを意味します。

for ループでは、配列のインデックスが存在しない char 配列要素に値を代入していますuser。したがって、未定義の動作が発生します

配列の宣言を次のように変更します。

char user[length+1] = {0};

編集

コンパイラが可変長の静的配列の宣言をサポートしていない場合は、動的メモリ割り当てを使用できます。

char *user = malloc((length+1) * sizeof(char));

また、配列ポインタに関連するメモリがuserプログラムで役に立たなくなったら、忘れずに解放してください

free(user);
于 2013-04-30T09:36:46.617 に答える