2014-01-18 4 views
1
#include <stdio.h> 
#include <iostream> 

using namespace std; 


int write(int arr[]) 
{ 

    int n = (sizeof(arr)/sizeof(arr[0])); 

    for(int r=0;r<n;r++) 
    { 
     printf("%d\n", arr[r]); 
    } 

    return 0; 
} 

int main() 
{ 
    int numlist[] = {1, 3, 5, 6, 7, 9, 0, 2, 3}; 

    write(numlist); 

    std::string strvar; 
    std::cin >> strvar; 

} 

То, что печатается на экране, это просто номер «1». Больше ничего. Только начало C, и я пытаюсь получить синтаксис.Использование функции массива - C

+0

Что вы пытаетесь сделать? какой результат вы ожидаете? – rullof

+2

Вычислить 'int n = (sizeof (arr)/sizeof (arr [0]))' в функции 'main' и передать его при вызове функции' write'. –

+0

Не ожидал, что моя ошибка будет в этой конкретной строке кода. –

ответ

5

Вы не можете вычислить размер массива внутри функции, используя

(sizeof(arr)/sizeof(arr[0])); 

Это происходит потому, что функция видит только arr как указатель (массив, затухающий в указатель), а не как полный массив. Таким образом, n будет 1.

Вы должны указать размер в качестве дополнительного аргумента.

int write(int arr[], int n) 
{ 
    for(int r=0;r<n;r++) 
     printf("%d\n", arr[r]); 

    return 0; 
} 

и назвать его

write(numlist, sizeof(arr)/sizeof(arr[0])); 
+0

отлично, спасибо! –

2

Проблема заключается в следующей строке

int n = (sizeof(arr)/sizeof(arr[0])); 

В этом контексте C не имеет ни малейшего представления о том, что длина arr есть. Массивы в C просто не имеют свойства собственной длины. Следовательно, когда вы говорите sizeof(arr), это переводит в 1 не количество элементов.

Для того, чтобы сделать эту работу, Вы должны явно передать количество элементов в массиве функции наряду с массивом

2

int n = (sizeof(arr)/sizeof(arr[0])); не работает в этом контексте, поскольку arr является параметром функции, который заглох к указателю в этой точке. Либо передайте количество элементов функции, либо используйте значение сторожевого знака, чтобы пометить конец массива.

3

Внутри

int write(int arr[]) 

arr является int*. sizeof(arr)/sizeof(arr[0]) выдается как 1 для вас, потому что указатели имеют тот же размер, что и целые числа в вашей системе.

Вы можете вычислить количество элементов в массиве только в том случае, если у вас есть доступ к его определению. В вашем случае это только внутри main. Если вы хотите, чтобы передать массив в другую функцию вы также должны передать его длина

int write(int* arr, size_t num_elems) 
{ 
    for(int r=0;r<num_elems;r++) { 
     printf("%d\n", arr[r]); 
    } 
    return 0; 
} 

int main() 
{ 
    int numlist[] = {1, 3, 5, 6, 7, 9, 0, 2, 3}; 
    size_t num_elems = sizeof(arr)/sizeof(arr[0]); 
    write(numlist, num_elems); 
} 

В качестве альтернативы, если определить значение дозорного, который отмечает конец массива, вам не нужно проходить длину

int write(int* arr) 
{ 
    while (*arr != -1) { 
     printf("%d\n", *arr); 
     arr++; 
    } 
    return 0; 
} 

int main() 
{ 
    int numlist[] = {1, 3, 5, 6, 7, 9, 0, 2, 3, -1}; /* element with value -1 
                 marks the end of the 
                 array */ 
    write(numlist); 
} 
1

в C/C++, когда ИмяМассива передается в качестве параметра, это преобразовать в указатель. , поэтому в этой функции sizeof (arr) равен sizeof (int *).

INT C++

int a[10]; 
int (&b)[10] = a; // b is a reference of int array whose length is 10; 

//so here could be ok 
template< size_t n> 
size_t write(int (& new_array_name)[n]) 
{ 
    // 
} 
1

На 64-битной операционной системы, SizeOf (обр [0]) возвращает 4 байта, а SizeOf (обр) возвращает 2 байта. В моей системе n имеет значение 2. По этой причине цикл выполняет в моей системе r < 2 раза.В 32-разрядной операционной системе sizeof (arr [0]) возвращает 2 байта вместо 4 байтов. Вот почему вы получаете только индекс 0 of arr.

Смежные вопросы