[英]Issue working with double pointers
我是C语言的新手,无法将自己的头缠绕在双指针周围,并且不断遇到分段错误错误。 我已经对该程序进行了一些调试,并找出了哪里出错了,但是我一生都无法找出原因。 我将首先发布我的代码:
int main() {
printf("Enter string to be split: \n");
a = readline();
String *st = newString(a);
String **split;
int num;
num = string_split(st, ',', split);
for (i=0; i<num; i++) { print_string(*(split+i)); }
}
readline()生成一个指向字符数组的指针(由用户输入),并在其后附加“ \\ 0”。 newString和print_string绝对可以工作。 这是字符串的结构:
typedef struct {
char *chars;
int length;
int maxSize;
} String;
这是string_split的代码,这给我带来了所有麻烦。
int string_split(String *s, char delim, String **arrayOfStructs) {
char *c = getCharacters(s);
int len = length(s);
int begin = 0;
int end;
int arraycount = 0;
String **temp = (String**)malloc(sizeof(String*));
for (end=0; end<len+1; end++) {
if ((*(c+end) == delim || *(c+end) == '\0') && begin != end) {
String *st = substring(s,begin,end-1);
*(temp + arraycount) = st;
begin = end + 1;
arraycount++;
temp = (String**)realloc(temp, 1+arraycount*sizeof(String*));
}
}
arrayOfStructs = temp;
return arraycount;
}
总的来说,当我重新拆分时,它指向的所有String *也都消失了。 当print_string获取单个String *并尝试获取其成员之一时,会发生分段错误。 我不明白为什么,因为我觉得我每次都需要分配内存,但是我觉得我丢失了一些东西。 另外,在调试时,如果我逐步执行string_split,将按照预期的方式生成temp,因此我认为我只是不在应分配的位置分配内存,这与函数的逻辑无关。 这是子字符串中的代码,尽管我非常确定它可以工作,因为我已经能够从子字符串返回String *并将它们传递给print_string了。
String *substring(String *s1, int begin, int end) {
String *s = (String*)malloc(sizeof(String));
int length = 0;
s->maxSize = 20;
char *temp = (char*)malloc(20*sizeof(char));
char *arr = s1->chars;
int i;
for (i=begin; i <= end; i++) {
*(temp+length) = *(arr+i);
length++;
if (length == s1->maxSize-1) {
s1->maxSize = s1->maxSize+20;
temp = (char*)realloc(temp, s1->maxSize*sizeof(char));
}
}
*(temp+length) = '\0';
s->length = length;
s->chars = temp;
return s;
}
任何帮助是极大的赞赏!
您需要按引用而不是按值传递参数arrayOfStructs
。 由于C实际上没有适当的引用,因此您必须将指针传递给变量:
int string_split(String *s, char delim, String ***arrayOfStructs) {
...
*arrayOfStructs = temp;
return arraycount;
}
使用地址运算符&
调用它:
num = string_split(st, ',', &split);
现在,您通过value传递参数,这意味着变量arrayOfStructs
只是函数内部的本地副本。 对它的任何更改都只对副本进行,并且一旦函数返回时变量超出范围,则丢失。
String **temp = (String**)malloc(sizeof(String*));
*(temp + arraycount) = st;
temp + arraycount将为您提供一个随机的内存地址。 temp包含刚分配的指针,该指针应指向另一个指针(尚未初始化),但是您要递增该指针,以便释放刚刚分配的位置。
temp不指向连续的内存,它专门指向另一个指针(在64位计算机上为8bytes)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.