关于 C 中的强制转换的混乱

Hel*_*PLs 0 c malloc pointers casting

我只是想问一下有什么区别

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

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

因为我在做项目时遇到了这种情况,我尝试创建一个数组作为指针,并动态为其分配内存。但是当我使用时,int * a = malloc(sizeof(int))我无法更改数组的任何值,从而导致分段错误,当我将其更改为int * a =(int *)malloc(sizeof(int))它时,一切都开始正常工作。更准确地说,这是有问题的代码:

     int i = 0;
     for (i = 0; i < valCounter; i++) {
          if (strcmp(vars[i].name, name) == 0) {
               return 2;
          }
     }
     strcpy(vars[valCounter].name, name);
     strcpy(vars[valCounter].type, type);
     i--;
     vars[i].intArrayVal = (int *)malloc((dimension + 5) * sizeof(int)); 
     int j = 0;
     char currentNumber[1000];
     char elemente[1000];
     int *pointer;
     strcpy(elemente, elements);
     strcpy(currentNumber, strtok(elemente, ","));
     vars[i].intArrayVal[j++] = atoi(currentNumber);
     while (currentNumber != NULL && j <= i) {
          strcpy(currentNumber, strtok(NULL, ","));
          vars[i].intArrayVal[j++] = atoi(currentNumber);
     }
     valCounter++;
     return 0;
Run Code Online (Sandbox Code Playgroud)

在这里,如果我使用没有演员的版本,它就无法正常工作,并且在更改了我将演员放在那里的事实后,它开始按预期工作。

P__*_*J__ 5

C施法与否,语言没有区别。如果出现错误,则意味着您编译为C++. C++是一种完全不同的语言,不使用C++编译器来编译C代码

我无法更改数组的任何值,导致分段错误

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

您仅为一个整数分配空间 - 数组只有一个元素长。当您尝试访问除a[0]您访问无效内存位置之外的任何元素时。

如果您想为更多整数分配空间,您需要:

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

或更好

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

在 s 中使用对象sizeof而不是类型。如果更改对象的类型,则不必更改sizeof. 很容易错过一两个引入很难调试和发现错误