1

我遇到了一个奇怪的问题。我写了一个简单的 C 程序(两个源文件,相关部分如下所示)。当我运行程序(ac 具有该main功能)时,我得到了输出(因为我调用的次数process很高,所以我正在将最后几个打印输出从输出打印到屏幕):

key: 'Q'
key: 'A'
1
key: 'A'
key: 'A'
1
key: 'A'
key: 'A'
1
key: 'A'
key: 'A'
key: 'C'
Segmentation fault (core dumped)

交流

void process(int* hash, char* input, int number_of_ac) {
    int value, i = 0;
    for(; i < number_of_ac; i++) {
        value = get_value(hash, input[i]);
        printf("1\n");
        increment_value(hash, input[i]);
    }
}

公元前

int get_value(int* hash, char key) {
    printf("key: '%c'\n", key);
    return hash[get_index(key)];
}

void increment_value(int* hash, char key) {
    int value = get_value(hash, key);
    hash[get_index(key)] = ++value;
}

我的问题具体是(我的最终目标是尝试调试为什么我在大量process调用而不是在少量调用时出现分段错误),我不应该看到这样的打印输出:

key: 'Q'
1
key: 'A'
1
key: 'A'
1
key: 'A'
etc.

为什么我在再次看到 1 之前看到两个字母的打印?这是我的语句被打印到屏幕上的缓冲区重新排序问题吗?或者,是不是我的 C 程序在幕后是多线程的?

顺便说一句,这个完全相同的程序在我的笔记本电脑上运行,但输入集要大得多:

Linux Ubuntu 3.8.0-25-generic #37-Ubuntu SMP Thu Jun 6 20:47:07 UTC 2013 x86_64 x86_64 x86_64 GNU/Linux

但它在另一台机器上的一个更小的输入上打破了上面的分段错误:

Linux xyz 2.6.32-279.19.1.el6.cny6.7068.x86_64 #1 SMP Mon Mar 11 08:59:43 CDT 2013 x86_64 x86_64 x86_64 GNU/Linux

有任何想法吗?感谢您的帮助!

4

1 回答 1

1

看看你如何调用增量值:

void increment_value(int* hash, char key) {
   int value = get_value(hash, key); // calling get_value
   hash[get_index(key)] = ++value;
}

所以你在这里打印一个 char 并在 process 函数中再次调用 get_value 。这就是为什么您会在 '1' 之前获得多个字符的打印

于 2013-07-16T23:33:21.213 回答