使用 malloc(sizeof()) 从 *void 到 *int [-fpermissive] 的无效转换

Ghi*_*slo 1 c malloc pointers heap-memory

我正在编写一个程序来计算两个数字的最大公约数,但我遇到了malloc函数和指针的问题。实际上,堆栈和堆段在内存中如何工作以及为什么工作是很清楚的。但是,我还无法理解malloc在程序中何时声明指针和使用是否有效、是否必要。这是代码:

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

int *calcolaDivisori(int);

int main(int argc, char** argv) {

    int foundCounter = 0;
    int i,j,s1,s2;
    int n1,n2;
    int mcd = 1,mcm;
    int *pn1,*pn2;
    int d1[100],d2[100];

    // INPUT dei due interi

    printf("Inserisci il primo numero :");
    scanf(" %d", &n1);
    printf("\nInserisci il secondo numero :");
    scanf(" %d", &n2);

    // calcolo divisori del primo e del secondo numero e li assegno ai relativi array

    pn1 = calcolaDivisori(n1);
    if (!pn1) return 1;
    pn2 = calcolaDivisori(n2);
    if (!pn2) return 1;

    for (i=0;i<n1;i++) {
        d1[i] = pn1[i];
    }

    for (i=0;i<n2;i++) {
        d2[i] = pn2[i];
    }

    free(pn1);
    free(pn2);

    // confronto i divisori e calcolo il MCD

    s1 = sizeof(d1) / sizeof(int);
    s2 = sizeof(d2) / sizeof(int);

    for(i=0; i<s1; i++) {
        for (j=foundCounter; j<s2;j++) {
            if (d1[i] == d2[j]) {
                mcd*= d1[1];
                foundCounter = j+1;
                break;
            }
        }
    }

    printf("\n\nIl minimo comune divisore e' : %d", mcd);

    return 0;
}

int *calcolaDivisori(int num) {
    int i;
    int *a = malloc(num * sizeof(int));
    if (!a) return NULL;
    for (i=2;i<num;i++) {
        if (num%i == 0) {
            num/=i;
            a[i-2]=i;
        }
    }

    return a;
}
Run Code Online (Sandbox Code Playgroud)

运行命令时,我在标题中收到错误:

int *a = malloc(sizeof(int));
Run Code Online (Sandbox Code Playgroud)

P.P*_*.P. 7

你需要投射:

int *a = (int*)malloc(num * sizeof(int));
Run Code Online (Sandbox Code Playgroud)

因为在 C++ 中没有从void*到的隐式转换type *

请注意,此转换在 C 中不是必需的,并且在 C 中这样做可能存在危险。

除了 之外#include <iostream>,您的代码中没有任何内容是 C++。因此,删除它并使用 C 编译器编译它,您就不需要此转换。