gpt4 book ai didi

c - 指针的数组表示法

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

我创建了一个函数,它返回指向新创建的矩阵的指针。现在我希望这个函数返回 status_t 类型的错误代码而不是指针。为此,必须添加另一个指针级别,并且必须通过引用返回矩阵。但是,我不明白为什么会出现段错误。这是我的工作代码 (a) 和我失败的尝试 (b) 的一部分:

(一)

int **create_matrix(size_t dimension) {
int **p;
size_t e;
size_t h;

if (dimension == 0)
return NULL;

for (h = 0; h < dimension; ++h) {
if ((p[h] = malloc(dimension * sizeof(int))) == NULL) {
for (e = h; e >= 0; --e) {
free(p[e]);
p[e] = NULL;
} <-------- missing closing brace
return NULL;
}
}
return p;
}

(b)

status_t create_matrix(size_t dimension, int ***p) {
size_t e;
size_t h;

if (p == NULL)
return ERROR_NULL_POINTER;

for (h = 0; h < dimension; ++h) {
if (((*p)[h] = malloc(dimension * sizeof(int))) == NULL) {
for (e = h; e >= 0; --e) {
free((*p)[e]);
(*p)[e] = NULL;
} <-------- missing closing brace
return ERROR_NO_MEMORY;
}
}
}

谢谢!

最佳答案

(a) 并不完全“有效”:

一方面,它的 { 多于 },因此它甚至无法编译。您可能忘记终止外部 for 循环。

int ** p;
...
if ((p[h]=...))

这会在初始化之前取消引用p。使用未初始化变量的值是未定义的行为。在使用p之前,您需要为其分配一些内容(可能通过动态分配另一个数组)。

要确定版本(b)是否有同样的问题,我们必须查看调用代码,但猜测它也是 UB。

内循环还有另一个问题:

        for (e = h; e >= 0; --e)

e 是一个 size_t,它是无符号整数类型,因此条件 e >= 0 始终为 true。

您使用什么编译器(和编译器选项)?使用 gcc -Wall -Wextra -pedantic ,我得到 warnings for both of these .

固定版本如下所示:

int **create_matrix(size_t dimension) {
int **p = calloc(dimension, sizeof *p);
if (!p) {
return NULL;
}

for (size_t i = 0; i < dimension; i++) {
if (!(p[i] = calloc(dimension, sizeof *p[i]))) {
while (i--) {
free(p[i]);
}
free(p);
return NULL;
}
}

return p;
}

版本 (b) 可以定义为

status_t create_matrix_2(size_t dimension, int ***p) {
if (!p) {
return ERROR_NULL_POINTER;
}
if (!(*p = create_matrix(dimension))) {
return ERROR_NO_MEMORY;
}
return SUCCESS_OR_SOMETHING;
}

我不确定你想要成功返回什么;您的版本 (b) 缺少返回语句。

关于c - 指针的数组表示法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56484826/

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