Здравствуйте.
Подскажите, пожалуйста, почему не получается взять адрес статического массива таким образом:
void func(void *param)
{
*((char **)param) = "Test name";
}
int main()
{
char name[15];
func((char **)&name); //&name и name, как показывает дебаггер, имеют один и тот же адрес
printf("%s", name); //Вывод какого-то мусора из памятиreturn 0;
}
А>Как исправить первый вариант? Пишу на С, так что С++ фичи не предлагать. А>Заранее спасибо за помощь.
сразу на счет ссылки на массив здесь.
Т.е. ты фактически получаешь указатель на первый элемент
Вообще, не совсем понятно что ты собираешься делать. Если копировать в массив то .. впрочем вот посмотри два варианта выбирай подходящий
правда во втором случае избыточно наличие name, вообще в принципе. Потому как он так и останется лежать баластом, в то время как собственно pp и будет носителем смыслов.
Здравствуйте, Аноним, Вы писали:
А>Здравствуйте. А>Подскажите, пожалуйста, почему не получается взять адрес статического массива таким образом: А>
А>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
Здравствуйте, Аноним, Вы писали:
А>Как исправить первый вариант? Пишу на С, так что С++ фичи не предлагать.
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[] );
Но, сначала, ты должен понять что тебе на самом деле надо.
Все эмоциональные формулировки не соотвествуют действительному положению вещей и приведены мной исключительно "ради красного словца". За корректными формулировками и неискажённым изложением идей, следует обращаться к их автором или воспользоваться поиском
> void func(void *param) > { > *((char **)param) ="Test name"; > } > > int main() > { > char name[15]; > func((char **)&name);//&name и name, как показывает дебаггер, имеют один и тот же адрес > printf("%s", name);//Вывод какого-то мусора из памяти > > return 0; > }
Насколько богатая фантазия у людей... я бы до такого не додумался.
Вот что значит незашоренное образованием сознание !
MZ>Насколько богатая фантазия у людей... я бы до такого не додумался. MZ>Вот что значит незашоренное образованием сознание !
На все 100% уверен, что зачинщик треда или учится на третьем курсе, или уже работает
на стажировке. Потому что самостоятельно изучающий язык разберётся со всем
самостоятельно, и не будет постить на форумы. У автора просто не было поблизости профессора,
который бы всё разъяснил, и после чего материал был бы успешно забыт.
Здравствуйте, smeeld, Вы писали: S>Потому что самостоятельно изучающий язык разберётся со всем самостоятельно, и не будет постить на форумы.
Довольно спорно. Ваше предположение не работает хотя бы потому, что я изучаю язык самостоятельно, но задаю вопросы на форумах. И, как показывает практика, таких, как я, не так уж и мало.
Здравствуйте, MasterZiv, Вы писали: S>Насколько богатая фантазия у людей... я бы до такого не додумался.
Благодарю за сарказм. Данный код был использован в качестве примера, чтобы не писать весь остальной код. На деле это было использовано для обработки функцией параметров разных типов. Если вы можете предложить способ получше (на С), прошу, скажите мне его. Я только буду рад узнать что-то новое.
Здравствуйте, yoip, Вы писали:
Y>Здравствуйте, smeeld, Вы писали: S>>Потому что самостоятельно изучающий язык разберётся со всем самостоятельно, и не будет постить на форумы. Y>Довольно спорно. Ваше предположение не работает хотя бы потому, что я изучаю язык самостоятельно, но задаю вопросы на форумах. И, как показывает практика, таких, как я, не так уж и мало.
Y>Здравствуйте, MasterZiv, Вы писали: S>>Насколько богатая фантазия у людей... я бы до такого не додумался. Y>Благодарю за сарказм. Данный код был использован в качестве примера, чтобы не писать весь остальной код. На деле это было использовано для обработки функцией параметров разных типов. Если вы можете предложить способ получше (на С), прошу, скажите мне его. Я только буду рад узнать что-то новое.
Ты напрасно обижаешься. Твой вопрос демонстрирует твое непонимание таких базовых концепций как массив и указатель (в частности, ты не понимаешь, что взятие адреса массива и взятие адреса указателя — это очень разные операции). Вряд ли на этом форуме найдутся желающие объяснять тебе этот материал. Поэтому типичная реакция на подобные вопросы — это "RTFM".
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;
}