[英]Checking NULL pointer segmentation fault in C
I have to split an initial char and create a list of said char which has to end with a NULL so i can iterate over in the main without knowing list size.我必须拆分一个初始字符并创建一个必须以 NULL 结尾的所述字符的列表,这样我就可以在不知道列表大小的情况下进行主要迭代。 The problem is that i get a seg fault whenever i try to check if last element is NULL.
问题是,每当我尝试检查最后一个元素是否为 NULL 时,都会出现 seg 错误。 i am sorry i am still trying to learn both C and english.
对不起,我仍在努力学习 C 和英语。 Thank you all
谢谢你们
#include <stdlib.h>
#include <stdio.h>
char **split(const char *s) {
char **split;
unsigned m_size = 0, c_size, i, j, k;
// get s size
for (i = 0; s[i] != '\0'; i++) {
if (s[i] == ' ') {
m_size++;
}
}
m_size++;
split = (char**) malloc(sizeof(char) * (m_size + 1));
int sizes[m_size];
c_size = 0;
// get s words size
for (i = 0, j = 0; s[i] != '\0'; i++) {
if (s[i] == ' ') {
c_size++;
sizes[j] = c_size;
c_size = 0;
j++;
} else {
c_size++;
}
}
sizes[j] = c_size;
for (i = 0; i < m_size; i++) {
split[i] = (char *) malloc(sizeof(char) * sizes[i]);
}
split[i] = NULL;
for (i = 0, j = 0, k = 0; s[i] != '\0'; i++) {
if (s[i] != ' ') {
split[j][k] = s[i];
k++;
} else {
split[j][k] = '\0';
j++;
k = 0;
}
}
return split;
}
int main() {
char s[19] = "hello how are you?";
char **splitted;
unsigned i;
splitted = split(s);
if (splitted == NULL) {
return 1;
}
for (i = 0; splitted[i]!=NULL; i++) {
printf("%s\n", splitted[i]);
}
return 0;
}
EDIT编辑
#include <stdlib.h>
#include <stdio.h>
char **split(const char *s) {
char **r;
unsigned word_size = 0;
unsigned list_size = 0, i, j, k;
// get s size
for (i = 0; s[i] != '\0'; i++) {
if (s[i] != ' ') {
word_size++;
} else {
if (word_size > 0) {
list_size++;
word_size = 0;
}
}
}
list_size++;
r = malloc(sizeof(*r) * (list_size + 1));
int char_sizes[list_size];
for (i = 0; i < list_size; char_sizes[i] = 0, i++);
// get s words size
for (i = 0, j = 0; s[i] != '\0'; i++) {
if (s[i] != ' ') {
char_sizes[j]++;
} else {
if (char_sizes[j] > 0) {
j++;
}
}
}
for (i = 0; i < list_size; i++) {
r[i] = malloc(sizeof(char) * char_sizes[i]);
}
r[i] = NULL;
for (i = 0, j = 0, k = 0; s[i] != '\0'; i++) {
if (s[i] != ' ') {
r[j][k] = s[i];
k++;
} else {
if (k > 0) {
r[j][k] = '\0';
j++;
k = 0;
}
}
}
return r;
}
void destroy(char **list) {
unsigned i;
for (i = 0; list[i] != NULL; i++) {
free(list[i]);
}
free(list);
}
int main() {
char s[100] = " hello guys how are? you,d 31 3 ";
char **splitted;
unsigned i;
splitted = split(s);
if (splitted == NULL) {
return 1;
}
for (i = 0; splitted[i]!=NULL; i++) {
printf("%s", splitted[i]);
}
destroy(splitted);
return 0;
}
ok guys i followed your tips and i edited my code.好吧,伙计们,我遵循了您的提示,并编辑了我的代码。 leaving this here if someone wants to point out other errors i will appreciate.
如果有人想指出其他错误,我将不胜感激。 now it should work even with multiple spaces.
现在它甚至可以使用多个空格。 thanks to all
谢谢大家
Your are requesting an "array" of pointers to char, but you are allocating an "array" of chars:您正在请求一个指向 char 的指针的“数组”,但您正在分配一个字符的“数组”:
split = (char**) malloc(sizeof(char) * (m_size + 1));
should become应该成为
split = malloc(sizeof(char*) * (m_size + 1));
Note the sizeof(char*)
.注意
sizeof(char*)
。 BTW: Note that in C, you should not cast the result of malloc
as explained in this SO post.顺便说一句:请注意,在 C 中,您不应按照此SO 帖子中的说明
malloc
的结果。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.