【问题标题】:Pass char** as an argument to a function in C将 char** 作为参数传递给 C 中的函数
【发布时间】:2015-12-23 00:12:15
【问题描述】:

我知道有很多此类主题,但我已经阅读了其中的几个,但仍然无法弄清楚我做错了什么。

我已经成功生成了一个 char** 数组。我的冒泡排序功能可能也有效。但是当我将生成的数组传递给函数时,只复制了 1 行。

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

void sort(char** tab)
{
        char* temp;
        int i, j, size = sizeof(tab)/sizeof(tab[0]);
        printf("%d\n", size);

        for(i = 0; i < size; ++i)
        {
                for(j = i+1; j < size; ++j)
                {
                        if(strcmp(tab[j-1], tab[j]) > 0)
                                strcpy(temp, tab[j-1]),
                                strcpy(tab[j-1], tab[j]),
                                strcpy(tab[j], temp);
                }
        }
        for(i = 0; i < sizeof(tab)/sizeof(tab[0]); ++i)
                puts(tab[i]);
}

int main()
{
        srand(time(NULL));
        int size = rand()%5+5, i, j, s;
        char** tab = (char**)malloc(size * sizeof(char*));

        for(i = 0; i < size; ++i)
        {
                s = rand()%9+1;
                tab[i] = (char*)malloc(s+1);
                for(j = 0; j < s; ++j)
                        tab[i][j] = 'a'+rand()%26;
                tab[i][s] = 0;
        }
        for(i = 0; i < size; ++i)
                puts(tab[i]);
        puts("");
        sort(tab);
        return 0;
}

Here的代码是如何工作的。

当我在函数循环之前写 size=5 时,它会返回分段错误。

编辑: 与将数组的大小作为参数传递相同: http://ideone.com/3Wvncq

最终代码

我已经解决了所有问题,这里是final code。 我将分段错误误解为分配固定大小而不是不分配临时变量的结果。 谢谢大家的回答。

【问题讨论】:

  • 1) 遵循 ameyCU 关于将“size”作为参数传递的建议(而不是尝试在函数内部计算它。2)为“temp”分配空间(不要将“strcpy()”放入一个指针!!!)。

标签: c arrays sorting pointers bubble-sort


【解决方案1】:

不要在函数 void sort(char** tab) 内计算大小。在这个函数中,它将被计算为 -

int i, j, size = sizeof(tab)/sizeof(tab[0]);   // equivalent to sizeof(char **)/sizeof(char*) in function giving wrong length as you desire.

main 中的长度(size 是使用rand 生成的,因此无需查找),然后将其作为参数传递给函数sort

像这样声明你的函数 -

void sort(char** tab,size_t size) 

当从tab 的主通道长度调用它时 -

sort(tab,size);  // size will be number of elements in tab calculated in main

您因此得到分段错误 -

    if(strcmp(tab[j-1], tab[j]) > 0)
                 strcpy(temp, tab[j-1]),         
                 strcpy(tab[j-1], tab[j]),       
                 strcpy(tab[j], temp);

tempsort未初始化,但您仍将其传递给strcpy,因此未定义行为初始化temp在传递给strcpy之前。在函数sort中分配内存给temp

【讨论】:

  • 可能值得一提为什么 OP 不应该在函数内部计算。
  • 我已经尝试过了,它就像分配 size=5 一样(5 是最小尺寸)。它也返回分段错误。请看:ideone.com/3Wvncq
  • @ameyCU,tabmain 中的 malloc(ated) 指针(不是数组),在这种情况下,您无法使用 sizeof 获取大小。
  • @mr_jigsaw 我添加了分段错误的原因。
  • @AlterMann 对不起,对于这样的解释。我在回答中提到了。
【解决方案2】:

sort 函数中声明temp 变量:

char* temp;

稍后您将其用作字符串复制的目标(和源):

strcpy(temp, tab[j-1]),

但是你没有让temp指向任何地方,temp 未初始化,这会导致未定义的行为和你的崩溃。

不要使用指针,而是将其声明为可能具有最大字符串大小的数组。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 2018-04-21
    • 2015-09-26
    • 2015-03-17
    相关资源
    最近更新 更多