Bus Error: 10 in C Program, cannot figure out why

Bus Error: 10 in C Program, cannot figure out why

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void split_line(char **fields, char *line);

int main() {
    char *fields[5];
    char *line = "donuts,are,cool,and,tasty";
    int i = 0;

    split_line(fields, line);

    return 0;
}

void split_line(char **fields, char *line) {
    int i = 0;
    char *token, *delim;
    delim = ",\n";
    token = strtok(line, delim);
    while (token) {
        fields[i] = malloc(strlen(token));
        strcpy(fields[i], token);
        token = strtok(NULL, delim);
        i++;
    }

}

我是 C 语言的新手,花了一个多小时的时间试图弄清楚如何修复此错误。它编译但在 运行 时我得到

Bus Error: 10.

如果有人能告诉我为什么会发生这种情况以及我做错了什么,我将不胜感激。

因为您不能修改字符串文字,所以这是不合法的。像这样尝试

char line[] = "donuts,are,cool,and,tasty";

此外,请尝试在不修改输入字符串的情况下学习 strtok() 以外的内容,因为 strtok() 会这样做,这就是您收到错误的原因。

作为建议,始终对字符串文字使用 const

const char *line = "donuts,are,cool,and,tasty";

编译器会帮助您发现您正在尝试做一些坏事。

此外,您 malloc() 少了 1 个字符。字符串需要 length 个字符 + 1,最后一个字符是 null 终止符,如果要将数据用作字符串,则始终需要它,所有 str 函数期望这个值在那里,所以你需要为它分配 space,并复制它

size_t length = strlen(token);
fields[i] = malloc(length + 1);
if (fields[i] != NULL) {
    strcpy(fields[i], token);
}

可能是您分配不正确。如果您有权访问 strdup,请尝试使用它:

fields[i] = strdup(token);

您负责最终释放分配的内存。