所以这很奇怪-下面是我创建标记赋予器对象和主方法的代码:
struct TokenizerT_ {
char * sep;
char * toks;
};
TokenizerT *TKCreate(char *separators, char *ts) {
if (ts==NULL) {
return NULL;
}
int lin = (int) strlen(separators);
char yr[lin];
yr[0] = *separators;
int lim = 1;
int h = 1;
for(h=1; h<strlen(separators); h++){
char tmp = *(separators+h);
int z=0;
for (z=0; z<lim; z++) {
if (tmp==yr[z]) {
z=-1;
break;
}
}
if(z>-1){
yr[h] = tmp;
lim++;
}
}
TokenizerT inu = {yr, ts};
printf("%s\n", inu.sep);
return &inu;
}
int main(int argc, char **argv) {
char * arr = argv[1];
char * y = argv[2];
TokenizerT jer = *TKCreate(arr, y);
printf("%s\n", jer.sep);
printf("%s\n", jer.toks);
return 0;
}
如果我使用参数“tes”和“testing”运行程序,将得到以下结果:
测试
测试
测试
但是,如果我在TKCreate中运行带有printf语句注释的程序,则会得到:
测试。
printf(“%s\n”,jer.sep)停止工作,除了在TKCreate中注释printf语句外,我对代码没有做任何操作。为什么会这样?
最佳答案
这里有很多问题:inu
是一个局部变量。你把地址还给我。当您试图从main
中的该地址读取时,您正在访问一个不再在作用域中的变量。这是不明确的行为。sep
的inu
字段被指定为yr
。现在,yr
是一个局部变量,一个字符数组,它衰减为指针。同样,一旦函数返回,访问它就意味着访问其作用域已结束的变量。同样,行为不明确。
您使用的是可变长度数组,一个VLA。我怀疑这不是故意的。一般来说,VLAs是高级特性,只有当您清楚其含义时才应该使用。
我建议进行以下更改:
使用malloc
动态分配字符数组。
按值返回结构。
除此之外,我怀疑你还有其他问题。在我看来,yr
不是以空结尾的,有些元素可能根本没有初始化。这是故意的吗?也许您实际上是想在编写yr
时将separators
初始化为等于yr[0] = *separators
。注意,您的代码只分配一个字符。要动态分配yr
,并将其初始化为等于separators
,可以编写:
yr := malloc(strlen(separators)+1);
strcpy(yr, separators);
为什么要多次呼叫
strlen(separators)
?你似乎称之为1+strlen(separators)
次。你应该只打一次电话。关于c - 除非先前已打印,否则char数组不会在C中打印,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21532352/