0

次のコードがあります。

typedef struct{
    char *name;
    int age;
} person;


int main(){
    person Peter = {"peter", 19};
    person Petercp = Peter;
    Peter.name[0] = 'a';
    Petercp.name = "hello";
    printf("%s %d\n", Peter.name, Peter.age);
    printf("%s %d\n", Petercp.name, Petercp.age);
}

コンパイラは、行の「BAD ACCESS」のエラーメッセージを表示します

Peter.name[0] = 'a'

しかし、次の行は良いようです

Petercp.name = "hello";

person.name の配列が定数へのポインタのようです。結論を出すのは正しいですか?

そして、構造体内の配列を宣言すると

char name[];

再度変更を許可されました

Peter.name[0] = 'a'

何故ですか?

4

3 に答える 3

0

名前を割り当てると、"NAME"定数として定義される文字列リテラルが作成されます。nameしたがって、が指しているアドレスを変更することはできません。

6.7.3の下のc11にあります

const 修飾されていない型の左辺値を使用して、const 修飾された型で定義されたオブジェクトを変更しようとした場合、動作は未定義です。volatile 修飾されていない型の左辺値を使用して、volatile 修飾された型で定義されたオブジェクトを参照しようとした場合、動作は未定義です。

Peter.name[0] = 'a'

そして、それはまさにあなたがこの行でやろうとしていることです.

したがって、コードを壊すことになります。しかし、幸いなことに、コンパイラはこれを回避します。

于 2013-09-26T13:04:21.390 に答える