Указатель как параметр в C - PullRequest
0 голосов
/ 12 января 2019

enter image description here

Код не работает в моем компиляторе Xcode. Там написано * и точка ожидаема '('. Я действительно не знаю, что идет не так. Это должно было сработать.

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

void transformCopy(int *point);
void transformTrue(int *&point);

int main(){

    int *a,*b,i=0;

    transformTrue(a);
    transformCopy(b);
    for(i=0;i<5;i++) {a[i]=i;}
    for(i=0;i<5;i++){printf("%d  ",a[i]);}
    printf("\n");

    for(i=0;i<5;i++) {b[i]=i;}
    for(i=0;i<5;i++){printf("%d  ",b[i]);}
    printf("\n");
    return 0;
}
void transformCopy(int *point){
    point=(int*)malloc(5*sizeof(int));
}
void transformTrue(int *&point){
    point=(int*)malloc(5*sizeof(int));
}

1 Ответ

0 голосов
/ 12 января 2019

* & ожидаемая точка '('.

Ссылки не существуют в C (void transformTrue(int *&point)), это код C ++, а не C

Если вы хотите иметь эквивалент в C, вы должны использовать void transformTrue(int **point) и вам нужно позвонить transformTrue(&a);


Если я изменю ваш код, чтобы он делал в C то же, что и в C ++ (см. Комментарии):

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

void transformCopy(int *point);
void transformTrue(int ** point); /* ** rather than *& */

int main(){

    int *a,*b = 0,i=0;

    transformTrue(&a); /* &a rather than just a */
    transformCopy(b);
    for(i=0;i<5;i++) {a[i]=i;}
    for(i=0;i<5;i++){printf("%d  ",a[i]);}
    printf("\n");

    for(i=0;i<5;i++) {b[i]=i;}
    for(i=0;i<5;i++){printf("%d  ",b[i]);}
    printf("\n");
    return 0;
}
void transformCopy(int *point){
    point=(int*)malloc(5*sizeof(int));
}
void transformTrue(int ** point){ /* ** rather than *& */
    *point=(int*)malloc(5*sizeof(int)); /* *point = rather than point = */
}

transformTrue(&a) изменяет значение a , но transformCopy(b); ничего не делает, кроме локально (и утечки памяти) и обратно в main значение b по-прежнему 0, программа будет аварийно завершать работу при попытке записи по недействительным адресам

одна возможность - изменить transformCopy следующим образом:

int * transformCopy(){
  return (int*)malloc(5*sizeof(int));
}

и, конечно, звонок на b = transformCopy();

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...