Форум программистов, компьютерный форум, киберфорум
C для начинающих
Войти
Регистрация
Восстановить пароль
 
Рейтинг 5.00/5: Рейтинг темы: голосов - 5, средняя оценка - 5.00
0 / 0 / 0
Регистрация: 07.05.2012
Сообщений: 8
1

Ошибка при передаче указателя функции

07.05.2012, 17:31. Просмотров 968. Ответов 6
Метки нет (Все метки)

Привет!
В моем понимании приведенный ниже код должен дважды выводить одно и то же. Объясните мне, почему это не так.

Код:
C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
#include <stdio.h>
#include <stdlib.h>
 
void func(int *a, int *s);
 
int main(int argc, char *argv[]){
 
    int *array;
    int size, i;
 
    func(array, &size);
 
    for (i=0; i<size; i++)
        printf("%i\n", array[i]);
 
}
 
void func(int *a, int *s) {
    int j=0;
 
    *s = 5;
 
    a = (int *) malloc(sizeof(int) * *s);
    for(j=0; j < *s; j++)
        a[j] = j+5;
 
    for (j=0; j < *s; j++)
        printf("%i\n", a[j]);
 
}
Собственно, результат работы:
Код
5
6
7
8
9
1412476
-1216677816
4922752
1382974
1382990
0
Programming
Эксперт
94731 / 64177 / 26122
Регистрация: 12.04.2006
Сообщений: 116,782
07.05.2012, 17:31
Ответы с готовыми решениями:

Ошибка при передаче в функцию указателя на структуру.
Всем привет! Пишу программку по структурам. При передаче указателя на структуру в функцию выбивает...

Ошибка в передаче массива через функции
нужно создать двумерный вещественный массив (получилось создать только через целый) через функции...

Ошибка при передаче аргументов в функцию
Есть функция определения минимального значения: float minimum(float x,float y) { x = (x&lt;y)? x...

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

6
26 / 26 / 7
Регистрация: 05.04.2012
Сообщений: 248
07.05.2012, 17:38 2
У вас указатель array не инициализирован, поэтому у меня, например, вообще не компилируется.
0
0 / 0 / 0
Регистрация: 07.05.2012
Сообщений: 8
07.05.2012, 18:05  [ТС] 3
Хм, gcc не ругается.

Хорошо. Как его надо инициализировать, чтоб работало, как я хочу? То есть, чтоб функция писала в массив array.
0
Эксперт С++
5811 / 3462 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
07.05.2012, 19:27 4
У тебя параметром передается копия указателя, поэтому изменения, которые проводятся в функции, затрагивают только копию. Поэтому, если ты хочешь, к примеру, присвоить указателю участок памяти, выделенный malloc, то нужно передавать не сам указатель, а его адрес

C
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
#include <stdio.h>
#include <stdlib.h>
 
void func(int **array, size_t *size);
 
int main(void)
{
    int *array, i;
    size_t size;
    
    func(&array, &size);
    
    for(i = 0; i < size; ++i)
        printf("%d\n", array[i]);
    
    exit(0);
}
 
void func(int **array, size_t *size)
{
    int j;
    
    *size = 5;
 
    *array = malloc(*size * sizeof **array);
    
    for(j = 0; j < *size; ++j)
        (*array)[j] = j + 5;
    
    for(j = 0; j < *size; ++j)
        printf("%d\n", (*array)[j]);
}
У вас указатель array не инициализирован, поэтому у меня, например, вообще не компилируется.
Внутри функции func копия указателя инициализируется при вызове malloc. Но это изменение не затрагивает оригинальный указатель, объявленный в функции main. Компилятор на это максимум может предупреждение выдать
1
26 / 26 / 7
Регистрация: 05.04.2012
Сообщений: 248
07.05.2012, 21:01 5
Nameless One, я вас что, обманывать буду??....я ,правда, немного неправильно выразился, она как бы компилируется, но на этапе исполнения вылетает вот такая вот ошибка:
Run-Time Check Failure #3 - The variable 'array' is being used without being initialized.

Несложно перевести: переменная array была использована без инициализации.
0
0 / 0 / 0
Регистрация: 07.05.2012
Сообщений: 8
08.05.2012, 01:29  [ТС] 6
Nameless One, спасибо, понял, заработало.
0
Эксперт С++
5811 / 3462 / 356
Регистрация: 08.02.2010
Сообщений: 7,448
08.05.2012, 04:49 7
Цитата Сообщение от main.c Посмотреть сообщение
поэтому у меня, например, вообще не компилируется.
Цитата Сообщение от main.c Посмотреть сообщение
я ,правда, немного неправильно выразился, она как бы компилируется, но на этапе исполнения вылетает вот такая вот ошибка:
Нифига себе «немного неправильно» . Ошибки компиляции и ошибки времени выполнения — это совсем разные вещи
0
IT_Exp
Эксперт
87844 / 49110 / 22898
Регистрация: 17.06.2006
Сообщений: 92,604
08.05.2012, 04:49

Заказываю контрольные, курсовые, дипломные и любые другие студенческие работы здесь.

Ошибка компиляции при передаче указателя на объект в вектор
Реализированная на строках 32-39 функция записывающая даннные в вектор не работает и еще при...

Ошибка при передаче в функцию указателя на элемент массива
#include &quot;stdafx.h&quot; #include &lt;iostream&gt; #include &lt;ctime&gt; #include &lt;cstdlib&gt; #include &lt;cmath&gt; ...

Ошибка Access violation при передаче указателя в функцию
выделяю память для нужд програмных и соханяю его. char *resadres =(char*) VirtualAlloc (0,...

При передаче указателя в качестве аргумента функции теряется значение
Добрый день. Есть простенькая задачка сделать связанный список. При этом создается первый эелемнт...


Искать еще темы с ответами

Или воспользуйтесь поиском по форуму:
7
Ответ Создать тему
Опции темы

КиберФорум - форум программистов, компьютерный форум, программирование
Powered by vBulletin® Version 3.8.9
Copyright ©2000 - 2020, vBulletin Solutions, Inc.