C中结构中的初始化和声明数组,但给出错误

时间:2017-03-24 18:04:41

标签: c struct compiler-errors

为什么会出错?

#include<stdio.h>
#include<stdlib.h>
typedef struct bST
{
    int ID;
    char name[30];
    char surname[30];
    int friendsID[30];
    struct BST *left;
    struct BST *right;
}BST;
int main ()
{


}
BST *newNode(int ID, char name[], char surname[], int friendsID[])
{
    BST *newNodeTemp=(BST*)malloc(sizeof(BST));

    if(newNodeTemp==NULL)
    {
        printf("Not Allowed!!\n");
        exit(0);
    }

    newNodeTemp->ID=ID;
    newNodeTemp->name=name; //error here
    newNodeTemp->surname=surname; // error here
    newNodeTemp->friendsID=friendsID; //error here
}

数组类型错误初始化名称姓氏朋友数组。

3 个答案:

答案 0 :(得分:0)

newNodeTemp->name=name; //error here
newNodeTemp->surname=surname; // error here
newNodeTemp->friendsID=friendsID; //error here

这些错误是因为您尝试分配给数组,即使用数组作为左值。

对于char数组,如果它们已被终止,则使用strcpy(如果不是memcpy}和int数组,则可以使用memcpy复制内容从一个到另一个。

答案 1 :(得分:0)

对于char数组,strcpy()就可以了。 对于int数组,您可以逐项复制(不是那么优雅,但可以解决)或者您可以使用memcpy()为您执行脏工作。

在代码中尝试这些修改,看看它们是否有帮助:

逐个复制:

newNodeTemp->ID=ID;
strcpy(newNodeTemp->name,name);
strcpy(newNodeTemp->surname,surname);
for ( i=0; i<30; i++ )
    newNodeTemp->friendsID[i]=friendsID[i];

使用memcpy():

newNodeTemp->ID=ID;
strcpy(newNodeTemp->name,name);
strcpy(newNodeTemp->surname,surname);
memcpy(newNodeTemp->friendsID,friendsID,30);

更喜欢使用动态分配方法,因为它们更有效。 所以,而不是使用char name [30],surname [30],friendsID [30],而不是使用char * name,char * surname,int * friendsID并使用malloc()来请求所需的内存。 ; - )

答案 2 :(得分:-3)

我建议使用与C不同的语言.C是古老而原始的,并不像你想象的那样工作。值得注意的是,您的函数签名是不可行的,因为数组不是C中的第一类实体,因此签名完全等同于

BST *newNode(int ID, char* name, char* surname, int* friendsID) ...

如您所见,这些只是指向数据的指针;他们没有与他们相关的长度。每当将数组传递给C中的函数时,您必须始终传递数组的长度,除非有其他方法来确定长度 - 例如,以NUL结尾,作为C“字符串”的约定(在恐慌引号中)因为C)中没有字符串数据类型。

请注意,BST中的数组具有固定的大小长度,因此您要求阵列溢出。将这些声明为指针(注意声明语法中的其他改进)会更好:

typedef struct BST BST;
struct BST
{
    int ID;
    char* name;
    char* surname;
    int* friendsID;
    BST* left;
    BST* right;
};

然后你可以(注意各种改进和更正)

BST *newBST(int ID, char* name, char* surname, int* friendsID)
{
    BST* bst = malloc(sizeof *bst);

    if (!bst)
    {
        fprintf(stderr, "Out of memory.\n");
        exit(1);
    }

    bst->ID = ID;
    bst->name = name;
    bst->surname = surname;
    bst->friendsID = friendsID;
    bst->left = bst->right = NULL;
    return bst;
}

,前提是 namesurnamefriendsID参数都是malloced,friendsID以哨兵值终止你有其他方法可以知道它的长度。否则,您需要将朋友数作为参数传递给newBST并将其存储在BST节点中。