【问题标题】:Got segmentation fault on printing a String打印字符串时出现分段错误
【发布时间】:2020-04-04 21:22:38
【问题描述】:

在以下代码中,当我尝试打印字符串时,错误是“分段错误”。 调用sort_array(str, str_tmp, N)后,str就是NULL

为什么会这样?

当然这就是它失败的原因:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void sort_array(char **str, char **str_tmp, size_t N)
{
    for (size_t i = 0; i < N; i++)
    {
        size_t j = i;

        str = realloc(str, (i+1) * sizeof(char *));

        for ( ; j != 0 && strcmp(str_tmp[i], str[j-1] ) < 0; j--)
        {
             str[j] = str[j-1];
        }

        str[j] = str_tmp[i];
    }
}

int main(void) 
{
    char *str_tmp[] = { "d", "a", "c", "b", "r", "o", "k", "f"};
    const size_t N = sizeof( str_tmp ) / sizeof( *str_tmp );
    char **str = NULL;

    sort_array(str, str_tmp, N);

    for (size_t n = 0; n < N; n++)
    {
        printf("%s ", str[n]);
    }

    putchar('\n');

    free(str);

    return 0;
}

【问题讨论】:

  • str = realloc(str, (i+1) * sizeof(char *)); 这会改变一个 local 变量。来电者看不到变化。
  • @Kaylum,我用 char **str 调用 fanction 没关系?
  • 你已经previously问过这个问题。你为什么不听从那里给出的建议?
  • @Kaylum,我必须使用 realloc
  • @Kaylum,我知道 with return 它会起作用,我希望该函数无效

标签: c arrays sorting insertion-sort string-literals


【解决方案1】:

您必须通过引用传递指针str。否则,该函数处理指针的副本。那就是原来的指针保持不变。

你来了。

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

void sort_array(char ***str, char **str_tmp, size_t n)
{
    for (size_t i = 0; i < n; i++)
    {
        size_t j = i;

        *str = realloc(*str, (i+1) * sizeof(char *));

        for ( ; j != 0 && strcmp(str_tmp[i],( *str )[j-1] ) < 0; j--)
        {
             ( *str )[j] = ( *str )[j-1];
        }

        ( *str )[j] = str_tmp[i];
    }
}

int main(void) 
{
    char *str_tmp[] = { "d", "a", "c", "b", "r", "o", "k", "f"};
    const size_t N = sizeof( str_tmp ) / sizeof( *str_tmp );
    char **str = NULL;

    sort_array(&str, str_tmp, N);

    for (size_t n = 0; n < N; n++)
    {
        printf("%s ", str[n]);
    }

    putchar('\n');

    free(str);

    return 0;
}

程序输出是

a b c d f k o r 

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2018-11-26
    • 1970-01-01
    • 1970-01-01
    • 2020-03-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-05-18
    相关资源
    最近更新 更多