繁体   English   中英

使用双指针时出现问题

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM