为什么当我使用 void** 指针而不是 int** 时程序无法运行?

问题描述 投票:0回答:3

我试图编写一个程序来打印一个未指定维度的多维矩阵,我发现当我写入

void**
行时,该程序不会运行。这是为什么?

#include <stdio.h>
#include <stdlib.h>
    
int main() {
    int n = 0;
    printf("The size of matrix\n");
    scanf("%d", &n);
    int **rows; //it doesnt work with void 
    rows = malloc(n * sizeof(int *));
    int i, j;
    
    for (i = 0; i < n; i++) {
        rows[i] = malloc(n * sizeof(int));
    }
    
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 3; j++) {
             rows[i][j] = i + j;
             printf("%d", rows[i][j]);
        }

        printf("\n");
    }
    
    return 0;
}
c pointers matrix
3个回答
2
投票

当我写 void**

时不运行

这是因为您无法取消引用

void
指针,因为它没有引用任何类型。


2
投票

为什么当我使用

void**
指针而不是
int**
时程序无法运行?

根据规范,

void
是一种无法完成的不完整类型 (C 2018 6.2.5 19)。它主要是为了促进以通用方式使用指针。

rows
声明为
void **
时,
rows[i][j]
的类型为
void
。在
rows[i][j]=i+j;
中,您尝试将值分配给
void
对象。

要为对象赋值,编译器需要该对象的完整类型。它需要知道对象在内存中的表示方式,以便它可以写入表示内存中值的字节。当类型为

void
时,它是不完整的,并且没有关于如何在内存中表示值的信息。

C 标准指定了赋值的左操作数类型的约束,而

void
不满足这些约束,因此编译器会发出诊断消息。


0
投票

void 指针表示该指针基本上是空的,因此它能够保存程序中的任何数据类型地址。 但要访问数据,需要进一步类型转换为其他数据类型。

#include <stdio.h>
#include <stdlib.h>

int main() {
    int n = 0;
    printf("The size of matrix\n");
    scanf("%d", &n);
    void **rows; //it works now
    rows = malloc(n * sizeof(int *));
    int i, j;
    
    for (i = 0; i < n; i++) {
        rows[i] = malloc(n * sizeof(int));
    }
    
    for (i = 0; i < 3; i++) {
        for (j = 0; j < 3; j++) {
            *((int *)(*rows + i) + j) = i + j;
            //  rows[i][j] = i + j;
            printf("%d", *((int *)(*rows + i) + j));
        }

        printf("\n");        
    }
    
    return 0;
}
© www.soinside.com 2019 - 2024. All rights reserved.