【问题标题】:Segmentation Fault with strlenstrlen 的分段错误
【发布时间】: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


【解决方案1】:
    while(token != NULL)
    {
        token = strtok(NULL, " ");
        wordlength = strlen(token);
        /*lengthcounter += wordlength;*/ 
    }

token NULL 时,循环的最后一次迭代会发生什么?你还是把它传给strlen

另外,这几乎肯定是错误的:

     wordlist[i] = (char*)malloc(char_max*sizeof(char*));

您正在为指针分配空间,而不是字符。那么为什么sizeof(char*)?另外,不要转换malloc 的返回值。这是 C,不是 C++。

【讨论】:

  • 谢谢你原来的样子。 sizeof(char*) 是一个错误我还是 C 新手,指针仍然让我感到困惑。
猜你喜欢
  • 2016-03-25
  • 1970-01-01
  • 1970-01-01
  • 2013-01-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多