Передача адреса статического массива char
От: Аноним  
Дата: 16.03.14 22:12
Оценка: -1
Здравствуйте.
Подскажите, пожалуйста, почему не получается взять адрес статического массива таким образом:
void func(void *param)
{
    *((char **)param) = "Test name";
}

int main()
{
    char name[15];
    func((char **)&name); //&name и name, как показывает дебаггер, имеют один и тот же адрес
    printf("%s", name);   //Вывод какого-то мусора из памяти

    return 0;
}


И почему такой вариант работает:
void func(void *param)
{
    *((char **)param) = "Test name";
}

int main()
{
    char name[15];
    char **t = (char **)&name;
    func(t);
    printf("%s", *t);

    return 0;
}


Как исправить первый вариант? Пишу на С, так что С++ фичи не предлагать.
Заранее спасибо за помощь.
указатель массив статический адрес
Re: Передача адреса статического массива char
От: The Passenger Голландия  
Дата: 16.03.14 23:46
Оценка:
Здравствуйте, Аноним, Вы писали:


void func(void **param)
Весь мир — Кремль, а люди в нем — агенты
Re: Передача адреса статического массива char
От: sept_tone Интернет https://youtu.be/I3lhN5CUP2M
Дата: 17.03.14 00:58
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте.



А>Как исправить первый вариант? Пишу на С, так что С++ фичи не предлагать.

А>Заранее спасибо за помощь.
сразу на счет ссылки на массив здесь.
Т.е. ты фактически получаешь указатель на первый элемент
Вообще, не совсем понятно что ты собираешься делать. Если копировать в массив то .. впрочем вот посмотри два варианта выбирай подходящий

void func(void **param)
{
#if defined COPY_TO_ARRAY    
   ::strcpy(*((char **)param), "Test name");
#else   
   *((char **)param)="Test name";
#endif
   
}

int main_()
{
    char name[15]={'A', 'A', '\0'};
    void* pp = &name;
    func(&pp);
    printf("%s, %s\n", (char*)pp, name);

    return 0;
}
static int _ = main_();

правда во втором случае избыточно наличие name, вообще в принципе. Потому как он так и останется лежать баластом, в то время как собственно pp и будет носителем смыслов.
Re: Передача адреса статического массива char
От: Stanislav V. Zudin Россия  
Дата: 17.03.14 04:42
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Здравствуйте.

А>Подскажите, пожалуйста, почему не получается взять адрес статического массива таким образом:
А>
А>void func(void *param)
А>{
А>    *((char **)param) = "Test name"; // <-- #2
А>}

А>int main()
А>{
А>    char name[15];
А>    func((char **)&name); //&name и name, как показывает дебаггер, имеют один и тот же адрес
А>    printf("%s", name);   //Вывод какого-то мусора из памяти <-- #1

А>    return 0;
А>} 
А>


Ты пытаешься использовать массив name как переменную, в которой должен храниться указатель на строку.
Т.е. вместо того, чтобы поместить туда символы, которые вывести в строке #1, ты записываешь в первые 4 байта массива (для простоты рассматриваем х86 версию) адрес строки #2.
Поэтому #1 выводит мусор. А чтобы выводило не мусор надо кастить к указателю на строку, что ты и делаешь в своем втором примере.

Подход неправильный — ты путаешь заранее выделенные буферы под строки и возвращаемые указатели.
Выбери один из способов.

Да, если возвращаешь указатель на строку, то надо как-то сообщать, кто должен освобождать память (и должен ли).
_____________________
С уважением,
Stanislav V. Zudin
Re: Передача адреса статического массива char
От: Erop Россия  
Дата: 17.03.14 10:23
Оценка:
Здравствуйте, Аноним, Вы писали:

А>Как исправить первый вариант? Пишу на С, так что С++ фичи не предлагать.

1) Если пишешь на С, то зачем приводишь туда-сюда указатели? Варнинги? Читать их не пробовал?
2) Если есть трудности с указателями, то очень советую рисовать на бумажке квадратики, представляющие переменные.
указатель -- это такой квадратик, из которгго куда-то ещё торчит стрелоска.

Что такое массив? Это такой квадратик, разбитый на клеточки, в каждой из которых -- буква.
Массив неявно преобразуется в указатель на вервую свою клеточку, вернее нулевую.
Указатель на массив -- это указтель на всю эту структуру в памяти. При этом сам адрес -- тот же. Другой только тип.

То есть
char array[SIZE];
char* pC = array; /* указатель на первую букву */
&array; /* -- указатель на весь массив */
sizeof( *pC ); /* 1 */
sizeof(*&array); /* SIZE */

(void*) pC == (void*)&array; /* всегда даст 1! */
&pC; /* указатель на указтель на первую букву в array */


Ты хочешь из массива как-тос делать переменную, содержащую в себе адрес его первого элемента. И ты можешь это сделать, примерно так:
f( &pC );

Но ты пытаешься сделать не так, а просто интерпретировать память иначе, а ведь клетоски с нужной стрелоски впамяти при этом НЕ ВОЗНИКАЕТ...

то есть, если ты хочешь простоп ередать куда-то массив, то напиши, напрмиер, так
f( char arr[] );

Но, сначала, ты должен понять что тебе на самом деле надо.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
Re: Передача адреса статического массива char
От: smeeld  
Дата: 17.03.14 10:34
Оценка:
Здравствуйте, Аноним, Вы писали:

void func(void *param)
{
    strcpy((char*)param,"Test name");

    return;
  } 

int main()
{
    char name[15];

    (void) func((char*)name);

    printf("FACK==%s", name);

    return 0;
}
Re: Передача адреса статического массива char
От: MasterZiv СССР  
Дата: 17.03.14 15:02
Оценка: :))
On 17.03.2014 02:12, Аноним 963 wrote:


> void func(void *param)

> {
> *((char **)param) ="Test name";
> }
>
> int main()
> {
> char name[15];
> func((char **)&name);//&name и name, как показывает дебаггер, имеют один и тот же адрес
> printf("%s", name);//Вывод какого-то мусора из памяти
>
> return 0;
> }

Насколько богатая фантазия у людей... я бы до такого не додумался.
Вот что значит незашоренное образованием сознание !
Posted via RSDN NNTP Server 2.1 beta
Re[2]: Передача адреса статического массива char
От: smeeld  
Дата: 17.03.14 16:10
Оценка:
Здравствуйте, MasterZiv, Вы писали:


MZ>Насколько богатая фантазия у людей... я бы до такого не додумался.

MZ>Вот что значит незашоренное образованием сознание !

На все 100% уверен, что зачинщик треда или учится на третьем курсе, или уже работает
на стажировке. Потому что самостоятельно изучающий язык разберётся со всем
самостоятельно, и не будет постить на форумы. У автора просто не было поблизости профессора,
который бы всё разъяснил, и после чего материал был бы успешно забыт.
Re[3]: Передача адреса статического массива char
От: yoip  
Дата: 17.03.14 18:10
Оценка:
Здравствуйте, smeeld, Вы писали:
S>Потому что самостоятельно изучающий язык разберётся со всем самостоятельно, и не будет постить на форумы.
Довольно спорно. Ваше предположение не работает хотя бы потому, что я изучаю язык самостоятельно, но задаю вопросы на форумах. И, как показывает практика, таких, как я, не так уж и мало.

Здравствуйте, MasterZiv, Вы писали:
S>Насколько богатая фантазия у людей... я бы до такого не додумался.
Благодарю за сарказм. Данный код был использован в качестве примера, чтобы не писать весь остальной код. На деле это было использовано для обработки функцией параметров разных типов. Если вы можете предложить способ получше (на С), прошу, скажите мне его. Я только буду рад узнать что-то новое.
Re[4]: Передача адреса статического массива char
От: rg45 СССР  
Дата: 18.03.14 09:39
Оценка: -1
Здравствуйте, yoip, Вы писали:

Y>Здравствуйте, smeeld, Вы писали:

S>>Потому что самостоятельно изучающий язык разберётся со всем самостоятельно, и не будет постить на форумы.
Y>Довольно спорно. Ваше предположение не работает хотя бы потому, что я изучаю язык самостоятельно, но задаю вопросы на форумах. И, как показывает практика, таких, как я, не так уж и мало.

Y>Здравствуйте, MasterZiv, Вы писали:

S>>Насколько богатая фантазия у людей... я бы до такого не додумался.
Y>Благодарю за сарказм. Данный код был использован в качестве примера, чтобы не писать весь остальной код. На деле это было использовано для обработки функцией параметров разных типов. Если вы можете предложить способ получше (на С), прошу, скажите мне его. Я только буду рад узнать что-то новое.


Ты напрасно обижаешься. Твой вопрос демонстрирует твое непонимание таких базовых концепций как массив и указатель (в частности, ты не понимаешь, что взятие адреса массива и взятие адреса указателя — это очень разные операции). Вряд ли на этом форуме найдутся желающие объяснять тебе этот материал. Поэтому типичная реакция на подобные вопросы — это "RTFM".
--
Re[5]: Передача адреса статического массива char
От: MasterZiv СССР  
Дата: 18.03.14 11:31
Оценка: +3
On 18.03.2014 13:39, rg45 wrote:

> чтобы не писать весь остальной код. На деле это было использовано для

> обработки функцией параметров разных типов. Если вы можете предложить
> способ получше (на С), прошу, скажите мне его. Я только буду рад узнать
> что-то новое.
>
>
> Ты напрасно обижаешься. Твой вопрос демонстрирует твое непонимание таких
> базовых концепций как массив и указатель (в частности, ты не понимаешь,
> что взятие адреса массива и взятие адреса указателя — это очень разные
> операции).

Да на самом деле я просто вообще не врубаюсь в то, что там было написано
в коде. Для меня это просто бред, ночной кошмар. И соответственно, что
автор хочет, что ему нужно, остаётся загадкой.

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





void func(void *param)
{
     *((char **)param) = "Test name";
}

int main()
{
     char name[15];
     func((char **)&name); //&name и name, как показывает дебаггер, 
имеют один и тот же адрес
     printf("%s", name);   //Вывод какого-то мусора из памяти

     return 0;
}



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

> массива таким образом:


Да почему же не получается ? Всё берётся, всё "работает". Программа даже
корректно завершается.



#include "stdio.h"
#include "stdlib.h"

//#define VARIANT1 
 


void func(void *param)
{
   *((char **)param) = "Test name";
}

int main(int argc, char* argv[])
{
   char name[15];
   char *result = 0;

#ifdef VARIANT1
   func((char **)&name); //&name и name, как показывает дебаггер, имеют 
один и тот же адрес 

   result = name;
#else
   char **t = (char **)&name;
   func(t);
   result = *t;
#endif

   printf("result = %s\n", result);
   return 0;
}
Posted via RSDN NNTP Server 2.1 beta
 
Подождите ...
Wait...
Пока на собственное сообщение не было ответов, его можно удалить.