为什么会出错?
#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
}
数组类型错误初始化名称姓氏朋友数组。
答案 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;
}
,前提是 name
,surname
和friendsID
参数都是malloced,friendsID
以哨兵值终止你有其他方法可以知道它的长度。否则,您需要将朋友数作为参数传递给newBST并将其存储在BST节点中。