为什么我不能分配结构参数? (C)

时间:2013-12-20 13:55:41

标签: c types structure variable-assignment

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

struct BOOK{
char name[15];
char author[33];
int year[33];
};

struct BOOK *books;
int main(){
int i,noBooks;
noBooks=2;
books=malloc(sizeof(struct BOOK)*noBooks);
books[0].year=1986;
books[0].author="JackLondon";
books[0].name='MartinEden';

getch();
return 0;
}

我的代码就是这样。当我使用scanf时,它可以工作,但我不能直接指定。

错误是:

error: incompatible types when assigning to type 'int[33]' from type 'int'|
error: incompatible types when assigning to type 'char[33]' from type 'char *'|
error: incompatible types when assigning to type 'char[15]' from type 'int'|
Build finished: 3 errors, 1 warnings 

我怎么能直接指定,哪里错了?

3 个答案:

答案 0 :(得分:1)

你做了什么:

// assign a numeric value to an array
int year[33];
books[0].year=1986;

// assign a pointer to a memory location of an array 
char name[15];
char author[33];
books[0].author="JackLondon";
books[0].name='MartinEden';

外观如何

struct BOOK{
    char name[15];
    char author[33];
    int year;
};

// ==============================

// assign numeric value to a normal int variable
books[0].year=1986;
// copy values to arrays
strcpy(books[0].author, "JackLondon");
strcpy(books[0].name, "MartinEden");

答案 1 :(得分:1)

您不能将一种类型的值分配给定义为不同类型的变量。在您的示例中,您尝试将单个整数1986分配给33个int变量的数组。

您的其他错误稍微有点难以解释。在C中,值"a string"的类型为char *,与char[]的类型不同,因此分配无效。虽然它们大致相同,但性质略有不同,但在处理字符串时,请阅读char指针与char数组之间的差异。

答案 2 :(得分:0)

此代码存在多个问题。一个问题是你将'year'声明为33个整数的数组。您可能希望int year;不是int year[33];,除非出于某种原因,您要保留与每本书相关的33个不同年份的列表。这解释了第一个错误。

第二个和第三个赋值(作者和年份)的问题在于你对C中数组和指针之间的区别感到困惑。(有时指针和数组的名称可以在C中互换使用,但并非总是如此,对于新的C程序员来说,这是一个令人沮丧的持续来源,因为它并不是直观的,为什么有些用法是错误的而其他用户是安全的。)网上有很多参考文献可以比我更好地解释这一点。这是一个:http://eli.thegreenplace.net/2009/10/21/are-pointers-and-arrays-equivalent-in-c/

编译器通过为您提供初始化字符数组的特殊语法来帮助解决这种混乱并没有帮助。当您声明一个char数组时,如下所示:

char c[33]="JackLondon";

编译器将为c保留33个字节,然后将“JackLondon”的字节复制到数组的开头,或多或少,就像您声明了数组一样,然后用strcpy()初始化它。 / p>

在您的具体情况下,您想要的是使用strcpy(或者,最好是strncpy)来加载您的结构,如下所示:

strncpy(books[0].author, "JackLondon", sizeof(books[0].author));