【发布时间】:2020-01-23 19:03:38
【问题描述】:
我想使用指针创建一个二维字符串数组,因为这样我以后可以释放动态内存并使用相同的标识符(变量)创建一个更小或更大的数组。
我使用了代码:
#include <stdio.h>
#include <string.h>
#include <stdlib.h>
unsigned long rows = 0;
unsigned long cols = 0;
unsigned long chrs = 30;
char ***mtx = NULL;
int rszmtx(char ***, unsigned long, unsigned long);
int main(int argc, char *argv[]) {
rszmtx(mtx, 0, 0);
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
strcpy(mtx[r][c], "[]");
}
}
for (int r = 0; r < rows; r++) {
for (int c = 0; c < cols; c++) {
printf("%s ", mtx[r][c]);
}
printf("\n");
}
return 0;
}
int rszmtx(char ***matrix, unsigned long y, unsigned long x) {
if (y <= 0) {
printf("Enter the number of rows: ");
scanf("%lu", &rows);
} else {
y = rows;
}
if (x <= 0) {
printf("Enter the number of cols: ");
scanf("%lu", &cols);
} else {
x = cols;
}
free(matrix);
matrix = (char ***) malloc(rows * sizeof(char **));
if (matrix == NULL)
return 1;
for (int r = 0; r < rows; r++) {
matrix[r] = (char **) malloc(cols * sizeof(char *));
for (int c = 0; c < cols; c++) {
matrix[r][c] = (char *) malloc (chrs * sizeof(char));
}
}
return 0;
}
在函数“main”中,我想调用函数“rszmtx”并为用户指定的“mtx”分配一个大小。然后我希望所有字符串都是“[]”并将它们打印出来。问题是我既不能分配也不能打印任何东西。在测试时,我注意到如果我将映射和/或打印放在“rszmtx”函数中,一切正常。为什么会这样,如何在“rszmtx”函数之外映射和打印“mtx”?
【问题讨论】:
-
您会想回顾一下为什么成为Three Star Programmer 通常不是一种恭维。
malloc的返回不用投,没必要。见:Do I cast the result of malloc? -
@DavidC.Rankin 嗯,我明白了。这很有意义,但我才刚刚开始使用这个 C 和指针,现在以这种方式处理它对我来说更容易理解。但是当我处理得更好时我会改变这三颗星,谢谢你的建议。