所以我的目标是创建一系列特定单词。这是我正在使用的当前代码:
char **specificWords; //Global
specificWords = malloc(100 * sizeof( char *));
int addToArray(char * word, int i){
specificWords[i] = word;
printf("%s\n", specificWords[i]);
return 0;
}
现在只是假装在main中,函数重复调用函数,增加“i”值和新的“words”。函数内部的print语句完全正常,但如果我尝试在函数外部使用相同的print语句,程序将以seg错误错误结束。
我仍然是C编程的新手,但我尝试了许多不同的东西,从每次调用时为数组分配空间。对于不同的递增方法,如“(** specificWords)++”,只是在主要使用循环,但我真的无法搞清楚。
如果你需要澄清任何事情,请告诉我,谢谢。
编辑:这是主...我试图发布一个程序来解释我的问题,所以这是真正的一个:char **specificWords; //Global
char *globalString;
int main(int argc, char* argv[]) {
specificWords = malloc(100 * sizeof( char *));
int newLineCount = countLines(globalString);
addToArray(newLineCount);
printf("%s\n", specificWords[0]); //segFaults
return 0;
}
int addToArray(int newLineCount){
int ch;
int loc = 0;
char *tempKeyword;
char temp[5026];
int j = 0;
int k = 1;
j = 0;
for(int i = 0; i < newLineCount; i++){
while(1){
//I read in a file and made the whole thing one big string which is global string
ch = globalString[loc];
if(ch == '\n')
break;
temp[j] = ch;
loc++;
j++;
}
loc++;
temp[j] = '\0';
tempKeyword = temp;
specificWords[k] = tempKeyword;
printf("%s\n", specificWords[k]);
//k++; // if used seg faults...
}
}
答案 0 :(得分:2)
您存储的指针word
可能超出范围或以其他方式变为无效。
直接存储像你这样的指针通常是错误的,也许addToArray()
函数应该存储strdup(word)
的返回值。然后你还需要测试它的失败,当然,因为它分配了内存。
答案 1 :(得分:2)
您使用了函数内部定义的本地字符串变量char temp[5026];
,在退出函数后将停止存在,因此您的printf将在函数中完美地工作但如果您尝试打印addToArray
以外的任何内容。
说明:
{ // this is a block of code, for example function body
char word[128]; // this string will exist at this level of code
// it will work perfectly at this level
}
// now, there's no word variable at all, any pointer to it's address (data)
// is invalid and could crash or you would read garbage from it
在这一行:
tempKeyword = temp;
specificWords[k] = tempKeyword;
您总是为每个单词分配整个临时缓冲区,因此您将始终获得所有特定单词索引中读取的第一个单词,例如specificWords[2]
。
要遵循unwind的建议,重写代码以从开头读取每个单词到temp,然后使用strdup将单词复制到动态分配的内存中,这些内存将从函数返回后继续存在。你的for循环内部:
j = 0; // always reset the position to buffer from beginning
while(1){
//I read in a file and made the whole thing one big string which is global string
ch = globalString[loc];
if(ch == '\n')
break;
temp[j] = ch;
loc++;
j++;
}
loc++;
temp[j] = '\0';
tempKeyword = strdup(temp);
specificWords[k] = tempKeyword;
printf("%s\n", specificWords[k]);
您正在从这一行开始计算您的单词索引:
int k = 1;
在C语言中,数组中的索引从零开始,因此您从specificWords
的容量中丢失了一个单词,因此您可以在数组中存储最多99个单词。要解决此问题,您可以从索引k=0
开始。