首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >理解未初始化值C

理解未初始化值C
EN

Stack Overflow用户
提问于 2022-10-13 12:27:47
回答 1查看 70关注 0票数 1

我用C编写了一个令牌程序,尽管它的工作方式与预期完全相同,但Val同僚抛出了未初始化的值错误。我非常清楚,对于解决这个问题的代码,我知道的不仅仅是一个解决方案。托卡器在使用前被编译并放入静态库中。

问题中的标记器

代码语言:javascript
复制
char ** tokenizer (char *source, const char *delim, int *length){
    char * string;
    int dimension = 2;
    char ** final_tokenization = malloc(sizeof(char *) * dimension);

    string = strtok(source,delim);
    int i = 0;

    while(string != NULL){
        if(i < dimension){
            final_tokenization[i] = string;
            i++;
        }else{
            dimension *= 2;
            final_tokenization = realloc(final_tokenization,sizeof(char *) * dimension);
            if(final_tokenization == NULL){
                return NULL;
            }
            final_tokenization[i] = string;
            i++;
        }
        string = strtok(NULL,delim);
    }
    //length being the final length of final_tokenization
    *length = i;
    return final_tokenization;
}

简单的主板来测试它

代码语言:javascript
复制
int main(int argc,char **argv){
if(argc == 3){
    int * length;

    char ** string = tokenizer(argv[2],argv[1],length);

    if((*length) == -1 && string == NULL){
        exit(-1);
    }
    
    for(int i = 0; i < (*length); i++){
        printf("%s \n",string[i]);
    }

    free(string);
}else{
    exit(-1);
}
return 0;

这样,./main " " "token1 token2 token3"的调用将每一行返回一个"tokenN“。

现在,正如我所理解的,当我调用tokenizer(argv[2],argv[1],length)时,我将长度地址的值传递给函数。上面提到的地址是什么是未知的(因为我还没有初始化变量),所以读取它会返回一些垃圾。更多的是用

代码语言:javascript
复制
int main(int argc,char **argv){
    if(argc == 3){
        int length;
        
        char ** string = tokenizer(argv[2],argv[1],&length);
[...]
}

不会产生任何错误。为什么会发生这种事?结果不应该一样吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2022-10-13 12:33:49

当你这样做时:

代码语言:javascript
复制
int * length;

char ** string = tokenizer(argv[2],argv[1],length);

length的值是不确定的,您正在读取这个不确定的值并将它传递给一个函数,而这个读取就是value告诉您的内容。

这段代码很可能是分段错误,因为tokenizer将尝试将该不确定值作为指针读取,然后尝试取消引用它。

相反,当您这样做时:

代码语言:javascript
复制
    int length;
    
    char ** string = tokenizer(argv[2],argv[1],&length);

传递给函数的值是length的地址,该地址定义得很好。然后,当tokenizer取消该指针值并将一个值写入已取消引用的指针时,它将在main中写入length

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/74055790

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档