gpt4 book ai didi

c - 为什么 realloc 会抛出 "Segmentation fault (core dumped)"

转载 作者:行者123 更新时间:2023-12-05 03:03:47 26 4
gpt4 key购买 nike

我是 C 语言的新手,这是一项学校作业。因此,我的任务是转置给定的矩阵。

我当前的功能如下:

void matrixTranspose(int rows, int cols, int **array) {
int temp[rows][cols];
int i, j;

for (i = 0; i < rows; i++) {
for(j = 0; j < cols; j++) {
temp[i][j] = array[i][j];
}
}

array = realloc(array, cols * sizeof(int *));

for (i = 0; i < cols; i++) {
array[i] = realloc(array[i], rows * sizeof(int));
}

for (i = 0; i < cols; i++) {
for(j = 0; j < rows; j++) {
array[i][j] = temp[j][i];
}
}
}

如果我为列和行引入相等的值,或者如果行的值比列的值它工作正常,但由于某些原因当行的值较小 比列的值,它不起作用。 (抛出“段错误(核心转储)”错误)。

我的主图是这样的:

int main() {
int **mat;
int cols, rows;
int i, j;

printf("Enter number of rows\n");
scanf("%d", &rows);
printf("Enter number of columns\n");
scanf("%d", &cols);

mat = (int **) malloc (sizeof(int *) * rows);

for (i = 0; i < rows; i++) {
mat[i] = (int *) malloc (sizeof(int) * cols);
}

for (i = 0; i < rows; i++) {
for(j = 0; j < cols; j++) {
mat[i][j] = rand() % 10;
}
}

printf("\nBefore transpose: \n");
for (i = 0; i < rows; i++) {
for(j = 0; j < cols; j++) {
printf("%d ", mat[i][j]);
}
printf("\n");
}

matrixTranspose(rows, cols, mat);
printf("\nAfter transpose: \n");

for (i = 0; i < cols; i++) {
for(j = 0; j < rows; j++) {
printf("%d ", mat[i][j]);
}
printf("\n");
}

}

我希望我的解释正确,对不起我的英语,它不是我的母语。谢谢

最佳答案

当您在 matrixTranspose 中修改 array 时,您正在更改局部变量。该更改在调用函数中不可见,因此 main 中的 mat 不再指向有效内存。

您需要更改函数以接受 int ** 的地址并根据需要取消引用它。

void matrixTranspose(int rows, int cols, int ***array) {
int temp[rows][cols];
int i, j;

for (i = 0; i < rows; i++) {
for(j = 0; j < cols; j++) {
temp[i][j] = (*array)[i][j];
}
}

*array = realloc(*array, cols * sizeof(int *));
if (!*array) {
perror("realloc failed");
exit(1);
}

int min = rows < cols ? rows : cols;
for (i = 0; i < min; i++) {
(*array)[i] = realloc((*array)[i], rows * sizeof(int));
if (!(*array)[i]) {
perror("realloc failed");
exit(1);
}
}
if (rows > cols) {
for (i = min; i < rows; i++) {
free((*array)[i]);
}
} else if (cols > rows) {
for (i = min; i < cols; i++) {
(*array)[i] = malloc(rows * sizeof(int));
if (!(*array)[i]) {
perror("malloc failed");
exit(1);
}
}
}

for (i = 0; i < cols; i++) {
for(j = 0; j < rows; j++) {
(*array)[i][j] = temp[j][i];
}
}
}

请注意,如果行数和列数不同,您需要释放您不再拥有的额外行或使用malloc 分配新行。

另请注意,您应该检查 mallocrealloc 的返回值是否失败。

然后将mat的地址传给这个函数:

matrixTranspose(rows, cols, &mat);

关于c - 为什么 realloc 会抛出 "Segmentation fault (core dumped)",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/53548013/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com