Проблема указателя в C - PullRequest
2 голосов
/ 24 апреля 2009

Привет, Я пытаюсь изучить указатели на C, я просто хочу, чтобы моя функция "addtwo" добавляла 2 к каждому элементу входного целочисленного массива, но я получаю странные ошибки компиляции, вот версия без указателя, которая действительно не будет правильно компилироваться .

addtwo(int *arr[]) {
    int i=0;
    for(;i< sizeof(arr)/sizeof(int);i++) {
        arr[i] = arr[i] + 2;
    }
}

main() {
    int myarray[] = {1,2,3,4};
    addtwo(myarray);
}

Привет

Ответы [ 7 ]

7 голосов
/ 24 апреля 2009

У вас есть некоторые проблемы. Сначала вы пытаетесь передать int* параметру типа int**. Это не сработает. Дайте ему тип int*:

void addtwo(int *arr){
    int i=0;
    for(;i< sizeof(arr)/sizeof(int);i++){
        arr[i] = arr[i] + 2;
    }
}

Затем вам нужно передать размер в дополнительном аргументе. Проблема в том, что когда вы передаете массивы, вы действительно передаете только указатель (компилятор создаст временный указатель, который указывает на первый элемент массива). Так что вам нужно следить за размером самостоятельно:

void addtwo(int *arr, int size){
    int i=0;
    for(;i<size;i++){
        arr[i] = arr[i] + 2;
    }
}


int main(void) {
    int myarray[] = {1,2,3,4};
    addtwo(myarray, sizeof myarray / sizeof myarray[0]);
}

Теперь это будет работать. Также поместите тип возврата перед ними. Некоторые компиляторы могут отклонять ваш код, так как он больше не соответствует последнему стандарту C и долгое время считался устаревшим (исключение типа возврата было способом, который вы кодировали со старым K & R C).

3 голосов
/ 24 апреля 2009

Не связано с ошибкой компиляции, но ...

Вы должны передать sizeof (arr) функции, а не вызывать ее в функции. Когда массив передается в функцию, C больше не видит его как массив, а только как один указатель на память, так что sizeof (arr), как вы его сейчас вызываете, вернет размер указателя arr скорее всего 4.

Вот что я имею в виду в коде:

void addtwo(int *arr, int size){
    int i=0;
    for(;i< size;i++){
        arr[i] = arr[i] + 2;
    }
}

int main(){
    int myarray[] = {1,2,3,4};
    addtwo(myarray, sizeof(arr)/sizeof(int));
    return 0; 
}
3 голосов
/ 24 апреля 2009

addtwo(int *arr[]) должно быть addtwo(int *arr)

Вы не можете использовать sizeof для получения размера массива из указателя. Обычно вы либо передаете размер массива в виде отдельного аргумента, либо имеете специальное значение, помечающее последний элемент.

1 голос
/ 24 апреля 2009

В C обозначение int * arr [] совпадает с int ** arr.

0 голосов
/ 24 апреля 2009

Объявление аргумента addtwo действительно гласит:

arr - массив указателей на целое число

когда вы, вероятно, действительно хотите

указатель на массив целых чисел

" Как читать декларации C " действительно помогли мне ухватиться за эту тему некоторое время назад, возможно, она сделает то же самое для вас.

0 голосов
/ 24 апреля 2009

Хотя другие уже дали правильный ответ, в основном у вас есть массив указателей, когда у вас

int *arr[]

Я сомневаюсь, что это то, что вы хотите. Если у вас есть

int arr[]

тогда это также будет эквивалентно

int *arr
0 голосов
/ 24 апреля 2009

Вам необходимо передать указатель на первый элемент массива и размер массива. Типы массивов распадаются на указатели в контексте параметров функции. Попробуйте:

void addtwo(int *arr, size_t size){
    for(size_t i = 0; i < size; i++){
        arr[i] = arr[i] + 2;
    }
}


int main() {
    int v[] = { 1, 2, 3, 4, 5, 6, 7, 8, 9, 0 };
    addtwo(v, sizeof v / sizeof v[ 0 ]);
    return 0;
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...