The OpenNET Project / Index page

[ новости /+++ | форум | теги | ]

форумы  помощь  поиск  регистрация  майллист  вход/выход  слежка  RSS
"Проблема с указателями ;("
Вариант для распечатки  
Пред. тема | След. тема 
Форумы Программирование под UNIX (Public)
Изначальное сообщение [ Отслеживать ]

"Проблема с указателями ;("  
Сообщение от Ivanoff (ok) on 23-Мрт-09, 19:04 
Доброго времени суток!
Есть некоторый код:
...

void SomeFunct(struct RGB_s **Matrux)
{
   ...
   Matrux = malloc(sizeof(struct RGB_s)*headerInfo.height);
    
     if(Matrux==NULL)
       {
        printf("errr"); return -4;
       };

     for(i=0;i<headerInfo.height;i++)
       {
     Matrux[i] =  malloc(sizeof(struct RGB_s)*headerInfo.width);
         if(Matrux[i]==NULL)
            {
          // printf("errrR"); return -4;
            };    
       };
  
    ...
};

int main()
{
   struct RGB_s **Matrux;
  
    SomeFunct(Matrux);

    тут при обращении к полям Matrux программа валится в core.
    

  return 0;
};

Вопросы:
1. Почему так происходит?
2. Как исправить?

Высказать мнение | Ответить | Правка | Cообщить модератору

 Оглавление

Сообщения по теме [Сортировка по времени | RSS]


1. "Проблема с указателями ;("  
Сообщение от gaa (ok) on 23-Мрт-09, 19:28 
>1. Почему так происходит?

Потому что указатель изменяется только внутри SomeFunct.

>2. Как исправить?

Либо передавать указатель на Matrux в SomeFunct (т.е. struct RGB_s ***), либо возвращать значение для Matrux из SomeFunct.

И почитать всё же главу про указатели из учебника по программированию.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

3. "Проблема с указателями ;("  
Сообщение от Ivanoff (ok) on 23-Мрт-09, 20:12 
>
>Либо передавать указатель на Matrux в SomeFunct (т.е. struct RGB_s ***), либо
>возвращать значение для Matrux из SomeFunct.

Подскажите тогда как выделить память если передавать указатель на Matrux в функции SomeFunct

вот так не работает:

void SomeFunct(struct RGB_s ***Matrux)
{
   ...
    *Matrux = (struct RGB_s **)malloc(sizeof(struct RGB_s)*headerInfo.height);
    
     if(Matrux==NULL)
       {
        printf("errr"); return -4;
       };

     for(i=0;i<headerInfo.height;i++)
       {
     (*Matrux)[i] = (struct RGB_s *) malloc(sizeof(struct RGB_s)*headerInfo.width);
         if(Matrux[i]==NULL)
            {
          // printf("errrR"); return -4;
            };    
       };
   ...
};

>И почитать всё же главу про указатели из учебника по программированию.

Читал, но все же ястности нет ;(


Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

4. "Проблема с указателями ;("  
Сообщение от gaa (ok) on 23-Мрт-09, 21:16 
>>Либо передавать указатель на Matrux в SomeFunct (т.е. struct RGB_s ***), либо
>Подскажите тогда как выделить память если передавать указатель на Matrux в функции
>SomeFunct

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

struct RGB_s {
    int r,g,b;
};

struct headerInfoSt {
    int height;
    int width;
} headerInfo;

void SomeFunct(struct RGB_s ***Matrux_)
{
    // здесь была ошибка с типом создаваемого значения. строка должна быть типа struct RGB_s*
    struct RGB_s **Matrux = (struct RGB_s**)malloc(sizeof(struct RGB_s*)*headerInfo.height);

    // возвращаем значение "наружу"
    *Matrux_ = Matrux;

    if(Matrux==NULL)
    {
        printf("errr"); //return -4;
    };

    int i;
    for(i=0;i<headerInfo.height;i++)
    {
        Matrux[i] =  malloc(sizeof(struct RGB_s)*headerInfo.width);
        if(Matrux[i]==NULL)
        {
            // printf("errrR"); return -4;
        };    
    };
}

int main () {
    headerInfo.height = 2;
    headerInfo.width = 3;
    struct RGB_s **m;
    SomeFunct(&m);

    return 0;
}

>>И почитать всё же главу про указатели из учебника по программированию.
>Читал, но все же ястности нет ;(

Это азбука. Так что читай до просветления.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

2. "Проблема с указателями ;("  
Сообщение от михаил on 23-Мрт-09, 19:59 
>1. Почему так происходит?

Проверь изменяется ли Matrux после вызова SomeFunct? Передача параметра по значению.

>2. Как исправить?

Не передавать параметр по значению если интересен результат его изменения в функции.

Например функция может вернуть значение.

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

5. "Проблема с указателями ;("  
Сообщение от Alexx (??) on 24-Мрт-09, 03:43 
что у тебя в matrux -  элементы или указатели ?
ну неважно ...

  факт тот, что адрес, полученный от malloc в функции
  надо отдать обратно main-у

  типа так, если я правильно понял, что тебе нужно:

int main()
{
   struct RGB_s *Matrux;  // это пока неинициализированный ptr
                          
   rc = Somefunc(&Matrux);  // отдаем его адрес, ф-я должна выделить память и
                            //  инициализировать наш указатель

   dosomething(Martux[zzz]->field_of_your_struct);
}


int Somefunc (struct RGB_s **Matrux)  // ptr to ptr
{
   // для удобства можно завести локальный указатель
    struct RGB_s *Temp;

    Temp = malloc(....);           // отхапали память
    if (Temp == NULL) { .....};

    *Matrux = Temp;                //  отдаем адрес отхапанной памяти  main-у

    // теперь делай что хочешь с этой памятью - хоть тут, хоть в main

}

Высказать мнение | Ответить | Правка | Наверх | Cообщить модератору

Архив | Удалить

Индекс форумов | Темы | Пред. тема | След. тема
Оцените тред (1=ужас, 5=супер)? [ 1 | 2 | 3 | 4 | 5 ] [Рекомендовать для помещения в FAQ]




Партнёры:
PostgresPro
Inferno Solutions
Hosting by Hoster.ru
Хостинг:

Закладки на сайте
Проследить за страницей
Created 1996-2024 by Maxim Chirkov
Добавить, Поддержать, Вебмастеру