0

我正在尝试在 C 上运行以下代码:

#include "ex1_1.h"

void path(char **adj_mat, int u, int v)
{
        printf("test\n");
        char temp = *adj_mat[1];
        putchar(temp);
}

int main()
{
    int u = 5;
    int v = 5;
    char mat[5][5]={
    {'0', '1', '1', '1', '0'},
    {'0', '0', '0', '0', '1'},
    {'0', '0', '0', '0', '0'},
    {'0', '0', '0', '0', '0'},
    {'0', '0', '0', '0', '0'}
    };
    char** adj_mat = (char**)&mat;
    printf("Mtest\n");
    path(adj_mat, u, v);
    return 1;
}

我得到“分段错误”。

我不知道为什么,我猜这与我如何将 putchar() 与多维数组指针一起使用有关。

谢谢。

4

3 回答 3

3

Achar[5][5] 不是char **. _

将您的path函数声明为其中之一(它们是等效的):

void path(char (*adj_mat)[5], int u, int v)
void path(char adj_mat[5][5], int u, int v)

并像使用它一样

path(mat, u, v);

更新:现在是段错误的原因。

mat是 5 数组的 5数组,当用作表达式时char,它将“衰减”为指向 5 数组的指针。char这意味着mat可以将其用作指向 5 数组的指针。通常,类型的 n 数组T衰减为类型的指针T(注意T不会衰减!)。

所以请注意,mat当您将它传递给您的函数时,您将其用作表达式pass()。在 C 中,不可能将数组按原样传递给函数,但它只能“接收”指针。

char那么指向 的指针的指针和指向 5 数组的指针有什么区别char呢?他们的类型。以及它们的尺寸。

假设你有一个指向 a 的指针,char我们称之为它p,我们有一个指向 5-array 的指针q。简而言之:char **pchar (*q)[5]

当您编写时p[i],这将相当于*(p+i). 这里有指针算术。p+i具有值(这是一个地址)p加上i*sizeof(char *)因为p指向 a char *

当你看的时候qq+i就会有q加分的价值i*sizeof(char[5])

这些几乎总是不同的!


更新(现在真正的答案):你的情况更糟,因为你“强迫” char (*q)[5]“成为”a char p**(通过你的无效类型转换),所以在你的电话中

char temp = *adj_mat[1];

adj_mat[1]将查看矩阵的第二行并尝试将其值解释为指针(但它是一个 5 数组!),因此当您通过取消引用时,*adj_mat[1]您将降落在必杀技的某个地方 - 段错误!

于 2012-04-28T18:11:18.457 回答
1

The conversion (char**)&mat is undefined behavior. &mat is char(*)[5][5] (In words, pointer to array of 5 arrays of 5 chars), and you can't convert it to pointer to pointer to char.

I would write path like (assuming C99):

void path(char *arr,int u,int v) {
 char (*adj_mat)[v]=arr;
 ...
}
于 2012-04-28T18:13:28.143 回答
0

换行

char temp = *adj_mat[1];

char temp = adj_mat[1];

问题是在

*adj_mat[1];

您尝试取消引用指向无效地址的指针,即 '1' 的 ASCII 码(我想)。

于 2012-04-28T18:12:13.717 回答