use*_*er1 1 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;
}
Run Code Online (Sandbox Code Playgroud)
以下是代码的工作原理.
当我在函数循环之前写入size = 5时,它返回分段错误.
编辑:与将数组的大小作为参数传递相同:http: //ideone.com/3Wvncq
我已经解决了所有问题,这是最终的代码.由于分配固定大小而不是分配临时变量,我误解了分段错误.谢谢你的所有答案.
不要计算功能内部的大小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.
Run Code Online (Sandbox Code Playgroud)
它的长度main(size生成使用,rand因此无需查找),然后将其作为参数传递给函数sort.
像这样声明你的功能 -
void sort(char** tab,size_t size)
Run Code Online (Sandbox Code Playgroud)
而从主要通行证长度调用tab它 -
sort(tab,size); // size will be number of elements in tab calculated in main
Run Code Online (Sandbox Code Playgroud)
你因此而得到分段错误 -
if(strcmp(tab[j-1], tab[j]) > 0)
strcpy(temp, tab[j-1]),
strcpy(tab[j-1], tab[j]),
strcpy(tab[j], temp);
Run Code Online (Sandbox Code Playgroud)
temp是未初始化的sort并且你仍然把它传递给strcpy这样不确定的行为.在传递给.Allocate内存到函数之前初始化 .tempstrcpytempsort