【发布时间】:2015-04-18 02:14:29
【问题描述】:
我收到分段错误错误。当我注释掉“wordlength = strlen(token);”它运行良好。我不知道为什么当我将 strlen(token) 分配给 int 之前的几行时会发生段错误。如有任何帮助,我将不胜感激。
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define char_max 60
int main(int argc, char *argv[])
{
FILE *fp = fopen(argv[2],"r");
char **wordlist;
int row = 1;
int i;
char temp[100];
char *token;
int wordlength;
int lengthcounter;
wordlist = (char**)malloc(row*sizeof(char*));
for(i = 0; i < row; i++)
{
wordlist[i] = (char*)malloc(char_max*sizeof(char*));
}
while(fgets(temp, sizeof(temp), fp) != NULL)
{
lengthcounter = 0;
wordlength = 0;
token = strtok(temp, " ");
strcat(wordlist[row-1], token);
printf("%s\n", wordlist[row-1]);
lengthcounter = strlen(token);
while(token != NULL)
{
token = strtok(NULL, " ");
wordlength = strlen(token);
/*lengthcounter += wordlength;*/
}
printf("The lengthcounter is %d\n", lengthcounter);
}
free(wordlist);
fclose(fp);
return 0;
}
【问题讨论】:
-
似乎你没有在取消引用之前检查令牌是否可以为空 - 尝试使用 gdb 确认
-
值得注意的是 wordlength 是一个 int,而 strlen 返回一个 size_t。
-
这一行:'wordlist[i] = (char*)malloc(char_maxsizeof(char));'应该是:'wordlist[i] = malloc(char_max);'有几个原因: 1) 在 C 中,不要从 malloc() 转换返回值。 2) 代码需要一个指向放入 wordlist[i] 的字符数组的指针。但是该行通过乘以“sizeof(char*)”使分配时间延长了几倍注意:char* 是(取决于底层系统)4 或 8 个字节
-
当 #define'ing 一个数字时,总是将数字包含在括号 '(' 和 ')' 中以避免可能的字符替换问题。
-
编译器发出未使用“argc”的警告。给定发布的代码,需要检查“argc”是否指示正确的参数数量(如果不是正确的数字,则打印“使用”消息并退出
标签: c