将char **作为参数传递给C中的函数

时间:2015-09-25 08:00:29

标签: c arrays sorting pointers bubble-sort

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

我已经成功生成了一个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。 由于分配固定大小而不是分配临时变量,我误解了分段错误。 谢谢你的所有答案。

2 个答案:

答案 0 :(得分:5)

不要计算函数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.

它的长度为mainsize使用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);
temp

sort 未初始化,您仍然将其传递给strcpy,因此未定义的行为。在传递给temp之前,初始化 strcpy。在功能temp中将内存分配给sort

答案 1 :(得分:1)

sort函数中,您声明了temp变量:

char* temp;

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

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

但在两者之间没有任何地方temp点,temp未初始化,导致未定义的行为和您的崩溃。

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