我正在开发一个 C 函数来从文本文件中读取一行,使用 strtok 将其拆分为标记,并将每个标记分配给结构中的特定字段。但是,在使用 strcpy 将其中一个标记复制到结构字段时遇到分段错误。这是代码:
void readEnregFromTextFile(char *fileName, Tenreg *buffer) {
char string[256]; // Buffer to hold a line from the file
char *delimiters = ",|;\n";
FILE *f = fopen(fileName, "r");
if (f == NULL) {
printf("Error opening file\n");
return;
}
if (fgets(string, sizeof(string), f) != NULL) {
char *token = strtok(string, delimiters);
if (token != NULL) {
strcpy(buffer->name, token); // Copy first token to name
token = strtok(NULL, delimiters);
if (token != NULL) {
strcpy(buffer->departement, token); // Error occurs here
token = strtok(NULL, delimiters);
if (token != NULL) {
buffer->salary = atof(token);
}
}
}
} else {
printf("Error reading from file\n");
}
fclose(f);
}
问题 当函数执行 strcpy(buffer->departement, token); 时,我遇到分段错误。经过调试,我发现错误具体发生在C代码中的这一行。汇编输出显示以下行中的错误:
mov 0xb8(%rbp),%rax
我尝试用 strdup 替换 strcpy,该函数运行没有问题。但是,我想了解为什么 strcpy 会导致分段错误以及我的代码结构是否存在根本问题。
问题 为什么在这种情况下 strcpy 会导致分段错误,而 strdup 却可以工作? 在这种情况下我应该如何正确处理令牌分配? 任何见解将不胜感激!
使用我的水晶球:
如果
strdup
有效,而 strcpy
不起作用,则意味着 buffer->departement
正在引用 NULL
或野指针。
strdup
分配新内存并返回指向该内存的指针。