C - 创建“二维数组”时出现分段错误
C - Segmentation fault on creating "2D Array"
我必须创建一个包含 x 行的“二维数组”(用户可以决定多少行)并且每一行应该有随机数量的列,这些列将随机生成,因此它看起来像这样:
2 - 4 - 6
1 - 2 - 8 - 9 - 2 - 3
1 - 2
每行的列数将保存在 sizes[i] 中。二维数组中的数字将随机生成。我通过 Whosebug 查看了这里,并找到了一些有关动态内存分配的解决方案,但不知何故,我总是以 'Segmentation fault' 结束,而且我看不出我的代码中存在重大缺陷。因此,将不胜感激任何帮助。 :)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int** create_array(int* sizes, int rows){
int** array;
array=(int**) malloc(rows*sizeof(int*));
for(int i=0;i<rows;i++){
array[i]=(int*) malloc((sizes[i])*sizeof(int));
}
for(int i=0;i<rows;i++){
for(int j=0;j<sizes[i];j++){
array[i][j]=(((double) rand() / (RAND_MAX))*20);
}
}
return array;
}
void print_array(int** array, int* sizes){
int rows=sizeof(sizes)/sizeof(sizes[0]);
for(int i=0;i<rows;i++){
for(int j=0;j<sizes[i];j++){
printf("%d ",array[i][j]);
}
printf("\n");
}
}
int main(int argc, char const *argv[])
{
int rows = 0;
srand(time(NULL));
printf("Wie viele Zeilen möchten Sie erzeugen?");
scanf("%d",&rows);
int sizes[rows];
for(int i=0;i<rows;i++){
sizes[i]=(((double) rand() / (RAND_MAX))*9+1);
printf(" %d ",sizes[i]);
}
int** arr;
arr=create_array(sizes,rows);
print_array(arr,sizes);
return 0;
}
你有误
for(int j=0;i<sizes[i];j++)
应该是
for(int j=0;j<sizes[i];j++)
如果你使用更多的空格,比如
,会更容易发现
for (int j = 0 ; i < sizes[i] ; j++)
/* ^ see, here it's very clear now
另外,不要忘记在使用完数据后调用 free
。
也改变这个功能
void print_array(int** array, int* sizes){
int rows =sizeof(sizes)/sizeof(sizes[0]);
for(int i=0;i<rows;i++){
for(int j=0;i<sizes[i];j++){
printf("%d ",array[i][j]);
}
printf("\n");
}
}
无法确定 sizes
中元素的数量,您必须将其作为参数传递
void print_array(int** array, int* sizes, int rows)
{
for(int i=0;i<rows;i++){
for(int j=0;i<sizes[i];j++){
printf("%d ",array[i][j]);
}
printf("\n");
}
}
注意: 在c中不需要强制转换malloc
,它可以隐藏错误。
我必须创建一个包含 x 行的“二维数组”(用户可以决定多少行)并且每一行应该有随机数量的列,这些列将随机生成,因此它看起来像这样:
2 - 4 - 6
1 - 2 - 8 - 9 - 2 - 3
1 - 2
每行的列数将保存在 sizes[i] 中。二维数组中的数字将随机生成。我通过 Whosebug 查看了这里,并找到了一些有关动态内存分配的解决方案,但不知何故,我总是以 'Segmentation fault' 结束,而且我看不出我的代码中存在重大缺陷。因此,将不胜感激任何帮助。 :)
#include <stdio.h>
#include <stdlib.h>
#include <time.h>
int** create_array(int* sizes, int rows){
int** array;
array=(int**) malloc(rows*sizeof(int*));
for(int i=0;i<rows;i++){
array[i]=(int*) malloc((sizes[i])*sizeof(int));
}
for(int i=0;i<rows;i++){
for(int j=0;j<sizes[i];j++){
array[i][j]=(((double) rand() / (RAND_MAX))*20);
}
}
return array;
}
void print_array(int** array, int* sizes){
int rows=sizeof(sizes)/sizeof(sizes[0]);
for(int i=0;i<rows;i++){
for(int j=0;j<sizes[i];j++){
printf("%d ",array[i][j]);
}
printf("\n");
}
}
int main(int argc, char const *argv[])
{
int rows = 0;
srand(time(NULL));
printf("Wie viele Zeilen möchten Sie erzeugen?");
scanf("%d",&rows);
int sizes[rows];
for(int i=0;i<rows;i++){
sizes[i]=(((double) rand() / (RAND_MAX))*9+1);
printf(" %d ",sizes[i]);
}
int** arr;
arr=create_array(sizes,rows);
print_array(arr,sizes);
return 0;
}
你有误
for(int j=0;i<sizes[i];j++)
应该是
for(int j=0;j<sizes[i];j++)
如果你使用更多的空格,比如
,会更容易发现for (int j = 0 ; i < sizes[i] ; j++)
/* ^ see, here it's very clear now
另外,不要忘记在使用完数据后调用 free
。
也改变这个功能
void print_array(int** array, int* sizes){
int rows =sizeof(sizes)/sizeof(sizes[0]);
for(int i=0;i<rows;i++){
for(int j=0;i<sizes[i];j++){
printf("%d ",array[i][j]);
}
printf("\n");
}
}
无法确定 sizes
中元素的数量,您必须将其作为参数传递
void print_array(int** array, int* sizes, int rows)
{
for(int i=0;i<rows;i++){
for(int j=0;i<sizes[i];j++){
printf("%d ",array[i][j]);
}
printf("\n");
}
}
注意: 在c中不需要强制转换malloc
,它可以隐藏错误。