引用 int malloc 指针

deferencing the int malloc pointer

int main()
{

    /* Enter your code here. Read input from STDIN. Print output to STDOUT */
    int rslt, n;
    float sum = 0;
    scanf("%d", &n);
    int *tri = (int*)malloc(n * 3 * sizeof(int));
    if(tri == NULL){
        return 1;
    }
    printf("%d\n", *(tri[0]));

当我引用三指针时,它显示错误。 一元“*”的无效类型参数。 感谢你的回答。 以上部分已澄清,但我还有另一个问题。但我还有一个问题

int main()
{
    
    int rslt, n;
    float sum = 0;
    scanf("%d", &n);
    int *tri = (int*)malloc(n * 3 * sizeof(int));
    if(tri == NULL){
        return 1;
    }
    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            scanf("%d", &(tri[j]));
        }
        printf("\n");
    }

    for (int i = 0; i < n; i++)
    {
        for (int j = 0; j < 3; j++)
        {
            sum += tri[j] / 2;
            printf("%d %d\n",sum,tri[j] / 2);
        }
    }
    printf("%d\n",sum);


    return 0;
}

当我打印 tri[j] 时,它显示了一些垃圾值。

由于此声明

,变量 tri 的类型为 int *
int *tri = (int*)malloc(n * 3 * sizeof(int));

注意你分配了一个未初始化的内存。

表达式 tri[0] 的类型为 int。并且您正在尝试将取消引用运算符应用于 int

类型的表达式
*(tri[0])

所以编译器报错。

你可以这样写

int *tri = (int*)calloc(1, n * 3 * sizeof(int));

然后写成

printf("%d\n", tri[0]);

printf("%d\n", *tri);

这些for循环

for (int i = 0; i < n; i++)
{
    for (int j = 0; j < 3; j++)
    {
        scanf("%d", &(tri[j]));
    }
    printf("\n");
}

for (int i = 0; i < n; i++)
{
    for (int j = 0; j < 3; j++)
    {
        sum += tri[j] / 2;
        printf("%d %d\n",sum, tri[j] / 2);
    }
}
printf("%d\n",sum);

不正确。使用了不正确的转换说明符 %d 而不是 %f 和变量 sum 以及不正确的索引表达式。你需要写

for (int i = 0; i < n; i++)
{
    for (int j = 0; j < 3; j++)
    {
        scanf("%d", &(tri[3 * i + j]));
    }
    printf("\n");
}

for (int i = 0; i < n; i++)
{
    for (int j = 0; j < 3; j++)
    {
        sum += tri[3 * i + j] / 2;
        printf("%f %d\n",sum, tri[3 * i + j] / 2);
    }
}
printf("%f\n",sum);

数组表达式 a[i] 定义为 *(a + i) - 给定一些地址值 a,偏移量 i 个元素( 不是字节!) 从那个地址解引用结果,所以

*tri == *(tri + 0) == tri[0]

表达式 tri[0] 的类型为 int,这就是编译器在您编写 *(tri[0]) 时报错的原因;一元 * 运算符的操作数必须具有指针类型。

因此,在您的 printf 语句中,您将使用 *tri tri[0]。任一表达式的类型都是 int.

正如其他人所说,malloc 不会初始化分配的内存,因此 tri[0] 的值可能是任何值。您可以改用 calloc ,它将内存初始化为全零:

int *tri = calloc( n, sizeof *tri );

在 C 中,您不需要转换 malloccallocrealloc1 的结果,我们大多数人会建议你不要这样做。同样,由于表达式*tri的类型是int,所以sizeof *tri的结果与sizeof (int)相同。这样您就不必担心在声明、强制转换和 sizeof 表达式之间保持类型正确,因此您不太可能犯错。


  1. 在 C++ 中不是这种情况,但是如果您正在编写 C++,则无论如何都不应该使用 C *alloc 函数。