strcpy 导致分段错误
Strcpy resulting in segmentation fault
我不太确定为什么 strcpy 会导致分段错误,并且想知道是否有人可以向我解释原因。我最初有 temp->data = name
但每次我更改名称数组并寻找解决方案时都会导致节点值发生变化
typedef struct BST {
char *data;
struct BST *left;
struct BST *right;
}node;
node *create(char name[]){
node *temp;
temp = (node *) malloc(strlen(name) + 1);
strcpy(temp->data, name);
temp->left = temp->right = NULL;
return temp;
}
你应该首先 malloc 你的节点
temp = (node *) malloc(sizeof(node));
然后 malloc 你的新字符串
temp->data = (char *) malloc(strlen(name) + 1);
那么你可以使用
strcpy(temp->data, name);
此外,您需要将您的世代设置为您想要的任何值。
鉴于显示的结构,您分配的内存不足并复制到未初始化的指针。两者都很危险。
你需要更多类似的东西:
node *create(char name[]){
node *temp = malloc(sizeof(*temp));
if (temp == NULL)
return NULL;
temp->data = malloc(strlen(name) + 1);
if (temp->data == NULL)
{
free(temp);
return NULL;
}
strcpy(temp->data, name);
temp->left = temp->right = NULL;
// temp->generation = 0; // removed from revised question
return temp;
}
考虑是否可以使用 strdup()
分配字符串的副本。您仍然需要检查是否成功。请注意,释放 node
涉及对 free()
的两次调用。此外,调用代码需要检查节点是否已成功分配。但是,这段代码没有对其调用者强加任何错误处理策略——调用代码可以做它想做的事,只要它不尝试取消引用代码返回的空指针。
或者,您可以像这样使用 C99 'flexible array member':
typedef struct BST {
struct BST *left;
struct BST *right;
char data[];
} node;
node *create(char name[]){
node *temp = malloc(sizeof(*temp) + strlen(name) + 1);
if (temp == NULL)
return NULL;
strcpy(temp->data, name);
temp->left = temp->right = NULL;
// temp->generation = 0; // removed from revised question
return temp;
}
现在您可以通过单个 free()
调用释放结构。但是,您不能创建这些结构的数组(尽管您可以拥有指向此类结构的指针数组)。在树的上下文中,这不太可能成为问题。
我不太确定为什么 strcpy 会导致分段错误,并且想知道是否有人可以向我解释原因。我最初有 temp->data = name
但每次我更改名称数组并寻找解决方案时都会导致节点值发生变化
typedef struct BST {
char *data;
struct BST *left;
struct BST *right;
}node;
node *create(char name[]){
node *temp;
temp = (node *) malloc(strlen(name) + 1);
strcpy(temp->data, name);
temp->left = temp->right = NULL;
return temp;
}
你应该首先 malloc 你的节点
temp = (node *) malloc(sizeof(node));
然后 malloc 你的新字符串
temp->data = (char *) malloc(strlen(name) + 1);
那么你可以使用
strcpy(temp->data, name);
此外,您需要将您的世代设置为您想要的任何值。
鉴于显示的结构,您分配的内存不足并复制到未初始化的指针。两者都很危险。
你需要更多类似的东西:
node *create(char name[]){
node *temp = malloc(sizeof(*temp));
if (temp == NULL)
return NULL;
temp->data = malloc(strlen(name) + 1);
if (temp->data == NULL)
{
free(temp);
return NULL;
}
strcpy(temp->data, name);
temp->left = temp->right = NULL;
// temp->generation = 0; // removed from revised question
return temp;
}
考虑是否可以使用 strdup()
分配字符串的副本。您仍然需要检查是否成功。请注意,释放 node
涉及对 free()
的两次调用。此外,调用代码需要检查节点是否已成功分配。但是,这段代码没有对其调用者强加任何错误处理策略——调用代码可以做它想做的事,只要它不尝试取消引用代码返回的空指针。
或者,您可以像这样使用 C99 'flexible array member':
typedef struct BST {
struct BST *left;
struct BST *right;
char data[];
} node;
node *create(char name[]){
node *temp = malloc(sizeof(*temp) + strlen(name) + 1);
if (temp == NULL)
return NULL;
strcpy(temp->data, name);
temp->left = temp->right = NULL;
// temp->generation = 0; // removed from revised question
return temp;
}
现在您可以通过单个 free()
调用释放结构。但是,您不能创建这些结构的数组(尽管您可以拥有指向此类结构的指针数组)。在树的上下文中,这不太可能成为问题。