结构中的字符数组 - 不兼容的赋值?

时间:2009-08-18 08:34:41

标签: c struct char

我试图找出一个结构真的'是'并遇到问题,所以我真的有两个问题:

1)'sara'中保存了什么?它是指向结构的第一个元素的指针吗?

2)更有趣的问题:为什么不编译? GCC说“test.c:10:错误:分配中的不兼容类型”,我无法弄清楚为什么...... (这部分已经通过你的答案解决了,太棒了!)

#include <stdio.h>

struct name {
    char first[20];
    char last[20];
};

int main() {
    struct name sara;
    sara.first = "Sara";
    sara.last = "Black";
    printf("struct direct: %x\n",sara);

    printf("struct deref: %x\t%s\n", *sara, *sara);


}

感谢您的帮助!

8 个答案:

答案 0 :(得分:60)

这与结构无关 - C中的数组不可分配:

char a[20];
a = "foo";   // error

你需要使用strcpy:

strcpy( a, "foo" );

或在您的代码中:

strcpy( sara.first, "Sara" );

答案 1 :(得分:9)

或者您可以使用动态分配,例如:

struct name {
  char *first;
  char *last;
};

struct name sara;
sara.first = "Sara";
sara.last = "Black";
printf("first: %s, last: %s\n", sara.first, sara.last);

答案 2 :(得分:4)

使用strncpy确保没有缓冲区溢出。

char name[]= "whatever_you_want";
strncpy( sara.first, name, sizeof(sara.first)-1 );
sara.first[sizeof(sara.first)-1] = 0;

答案 3 :(得分:3)

您也可以像这样初始化它:

struct name sara = { "Sara", "Black" };

因为(作为一种特殊情况)你可以从字符串常量中初始化 char数组。

现在,关于结构实际是什么 - 它是由其他值组成的复合类型。 sara在内存中实际看起来是一个包含20个连续char值的块(可以使用sara.first引用,后跟0个或更多填充字节,后跟另外20个连续char值的块(可以使用sara.last来引用。struct name类型的所有其他实例都以相同的方式布局。

在这种情况下,不太可能存在任何填充,因此struct name只是一个包含40个字符的块,您可以为前20个字符和后20个字符命名。

您可以使用struct name找出sizeof(struct name)占用的内存块有多大,并且您可以找到该内存块中每个结构成员所在的位置{{1 }和offsetof(struct name, first)

答案 4 :(得分:2)

sara是结构本身,而不是指针(即表示存储实际结构数据的堆栈上的位置的变量)。因此,*sara毫无意义,无法编译。

答案 5 :(得分:0)

Sara结构是一个包含内部变量的内存块。经典声明之间几乎没有区别:

char first[20];
int age;

和结构:

struct Person{
char first[20];
int age;
};

在这两种情况下,您只是分配一些内存来存储变量,在这两种情况下都会保留20 + 4个字节。在您的情况下,Sara只是一个2x20字节的内存块。

唯一的区别是,对于一个结构,内存被分配为一个块,所以如果你取Sara的起始地址并跳过20个字节,你就会找到“last”变量。这有时很有用。

检查 http://publications.gbdirect.co.uk/c_book/chapter6/structures.html了解更多信息:)。

答案 6 :(得分:0)

您可以使用strcpy填充它。您也可以从另一个结构中初始化它。

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

struct name {
    char first[20];
    char last[20];
};

int main() {
    struct name sara;
    struct name other;

    strcpy(sara.first,"Sara");
    strcpy(sara.last, "Black");

    other = sara;

    printf("struct: %s\t%s\n", sara.first, sara.last);
    printf("other struct: %s\t%s\n", other.first, other.last);

}

答案 7 :(得分:0)

您可以通过这种方式尝试。我已经在我的情况下应用了这个。

#include<stdio.h>

struct name
{

  char first[20];

  char last[30];

};

//globally

// struct name sara={"Sara","Black"};

int main()

 {

//locally

struct name sara={"Sara","Black"};


printf("%s",sara.first);

printf("%s",sara.last);

}