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);
您负责最终释放分配的内存。
#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);
您负责最终释放分配的内存。