C 连续调用同一阵列时出现奇怪的seg错误

C 连续调用同一阵列时出现奇怪的seg错误,c,arrays,string,fault,C,Arrays,String,Fault,我真的很努力地寻找一个解决方案,但我想不出足够好的关键字 目前,我很难理解makeargv背后的概念以及它与三点指针的用法(我不知道***foo是什么意思,它似乎不像**foo或*foo那样容易理解)。所以我做了我自己的: const char **makeargv(char *string, int *numargs) { string = string + strspn(string, delims); char *copy = malloc(strlen(string) + 1);

我真的很努力地寻找一个解决方案,但我想不出足够好的关键字

目前,我很难理解makeargv背后的概念以及它与三点指针的用法(我不知道***foo是什么意思,它似乎不像**foo或*foo那样容易理解)。所以我做了我自己的:

const char **makeargv(char *string, int *numargs) {
  string = string + strspn(string, delims);
  char *copy = malloc(strlen(string) + 1);
  int i;
  strcpy(copy, string);

  int numtokens;
  if (strtok(copy, delims) != NULL) {
    for (numtokens = 1; strtok(NULL, delims) != NULL; numtokens++) {}
  }

  strcpy(copy, string);

  const char *results[numtokens+1];

  results[0] = strtok(copy, delims);

  for (i = 1; i < numtokens; i++) {
    results[i] = strtok(NULL, delims);
  }

  results[numtokens+1] = NULL;
  *numargs = numtokens;
  return results;
}
我有一个字符串的工作数组。但是,当我试图打印出数组中的字符串时,我只能打印我选择的1个字符串,然后它会为任何后续调用设置故障。让我们假设我的字符串数组是argv[3]={“Yes”、“no”、“maybe”},如果我调用argv[0],它将允许我调用“Yes”,但任何其他调用(即使我再次调用argv[0])都不起作用并导致segfault。我可以调用数组中的任何元素,但一旦调用其中一个元素,其余元素就会停止工作,从而导致错误

请帮忙?D:这是C

const char *results[numtokens+1];
此数组“results”是一个局部变量,它仅在“makeargv”内部可用

您最好使用malloc:

results = malloc(numtokens+1)
我相信你的代码中有内存泄漏。 您将无法释放“char*copy”的内存

#包括
#包括
#包括
char**makeargv(char*string,int*numargs){
静态常量char*delims=“\t\n”;
string=string+strspn(string,delims);
char*copy=malloc(strlen(string)+1),*p=copy;
strcpy(副本,字符串);
国际努姆托克斯;
for(numtokens=0;strtok(p,delims);+numtokens,p=NULL);
char**results=malloc(sizeof(char*)*(numtokens+1));
strcpy(副本,字符串);
int i;
p=副本;
对于(i=0;i对于(i=0;i)您应该创建,而不是描述您遇到的问题。很抱歉,当时我在运输途中,因为在我使用的计算机上,由于某种奇怪的原因,我在复制和粘贴方面遇到了问题。我现在已经修复了它,您现在可以看一下吗?:D
results = malloc(numtokens+1)
char *copy = malloc(strlen(string) + 1);
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

char **makeargv(char *string, int *numargs) {
    static const char *delims = " \t\n";
    string = string + strspn(string, delims);
    char *copy = malloc(strlen(string) + 1), *p = copy;
    strcpy(copy, string);

    int numtokens;
    for (numtokens = 0; strtok(p, delims); ++numtokens, p = NULL);

    char **results = malloc(sizeof(char*)*(numtokens+1));
    strcpy(copy, string);

    int i;
    p = copy;
    for (i = 0; i < numtokens; ++i, p = NULL)
        results[i] = strtok(p, delims);
    results[i] = NULL;
    *numargs = numtokens;
    return results;
}

FILE *file_open(char *filename){
    FILE *fp = fopen(filename, "r");
    if(!fp){
        perror("file_open");
        exit(1);
    }
    return fp;
}

void parse_file(char* filename) {
    char* line = malloc(160*sizeof(char));
    FILE* fp = file_open(filename);
    int i = 0, numargs = 0;

    while(fgets(line, 160, fp)){
        if (*line == '\n')
            continue;

        char **args = makeargv(line, &numargs);
        for(i = 0;i<numargs;++i)
            printf("%s\n", args[i]);
        printf("\n");

        if(args[0])
            free(args[0]);
        free(args);
    }
    fclose(fp);
    free(line);
}

int main(int argc, char *argv[]){
    parse_file(argv[1]);
    return 0;
}