在带有 strtok 的 C 函数中使用 strcpy 将标记复制到结构字段时出现分段错误

问题描述 投票:0回答:1

我正在开发一个 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 却可以工作? 在这种情况下我应该如何正确处理令牌分配? 任何见解将不胜感激!

c debugging segmentation-fault
1个回答
0
投票

使用我的水晶球:

如果

strdup
有效,而
strcpy
不起作用,则意味着
buffer->departement
正在引用
NULL
或野指针。

strdup
分配新内存并返回指向该内存的指针。

© www.soinside.com 2019 - 2024. All rights reserved.