我用C编写了一个令牌程序,尽管它的工作方式与预期完全相同,但Val同僚抛出了未初始化的值错误。我非常清楚,对于解决这个问题的代码,我知道的不仅仅是一个解决方案。托卡器在使用前被编译并放入静态库中。
问题中的标记器
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;
}简单的主板来测试它
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)时,我将长度地址的值传递给函数。上面提到的地址是什么是未知的(因为我还没有初始化变量),所以读取它会返回一些垃圾。更多的是用
int main(int argc,char **argv){
if(argc == 3){
int length;
char ** string = tokenizer(argv[2],argv[1],&length);
[...]
}不会产生任何错误。为什么会发生这种事?结果不应该一样吗?
发布于 2022-10-13 12:33:49
当你这样做时:
int * length;
char ** string = tokenizer(argv[2],argv[1],length);length的值是不确定的,您正在读取这个不确定的值并将它传递给一个函数,而这个读取就是value告诉您的内容。
这段代码很可能是分段错误,因为tokenizer将尝试将该不确定值作为指针读取,然后尝试取消引用它。
相反,当您这样做时:
int length;
char ** string = tokenizer(argv[2],argv[1],&length);传递给函数的值是length的地址,该地址定义得很好。然后,当tokenizer取消该指针值并将一个值写入已取消引用的指针时,它将在main中写入length。
https://stackoverflow.com/questions/74055790
复制相似问题