Простое равенство в массиве указателей.

Просто вернусь к немногому C++ программированию для uni и вспомнил, почему я думал, что этот бизнес-указатель настолько сумасшедший. Может ли кто-нибудь дать мне краткое объяснение, что происходит здесь? Можно ли получить int 20 в основной функции?

#include <stdio.h>

void test(int *b)
{
 b[0] = 10;
 b[1] = 20;
 printf("\n %i \n ", b[1]); // prints 20
}

int main( int argc, char* argv[] )
{
 int a;
 test(&a);
 printf("%i \n", a); //prints 10
 // printf("%i \n", a[1]); // doesn't compile - why not 20?
 return 0;
}
</stdio.h>

Извините, мой простой вопрос был таким бременем для некоторых пользователей, чтобы иметь дело с вами и поблагодарить пользователей, которые действительно восприняли это всерьез, и сообщить мне о неопределенном поведении. Причина, по которой я задал этот вопрос, был благодаря коду, который я обнаружил, что не могу понять, как его использовать. Я не просто вытащил это из воздуха. здесь это, если кто-то заинтересован. посмотрите на функцию glhUnProjectf и последний аргумент, как я должен использовать его. http://www.opengl.org/wiki/GluProject_and_gluUnProject_code

4 ответа

Честно говоря, я немного удивлен, что он позволяет присвоить значение b [1]. Я бы предположил, что если вы вытащили часть, которая не компилируется, вы получите segfault, когда вы попытаетесь назначить 20 на b [1], потому что вашей программе не было выделено это пространство в памяти. В любом случае, int a не является указателем, это переменная, поэтому она не может быть проиндексирована как массив.

Просто чтобы напомнить, вот разбивка переменных и указателей, которые у вас есть:

int a - a - целочисленная переменная в памяти, но ваша программа заботится только о значении целого числа, а не о том, где оно находится в памяти.

& a - возвращает указатель на целое число a в памяти. Поскольку указатели на массивы также просто указывают на первый элемент массива, программа не жалуется, когда вы пытаетесь ее индексировать

int * b - как a, это указатель на целое число, а не на целое число. Как уже упоминалось, указатели могут быть проиндексированы как массивы ([0], [1] и т.д.), Поскольку указатель на массив на самом деле является указателем на первый элемент в массиве. Как уже упоминалось, попытка индексировать прошлое пространства памяти, которое вы выделили, независимо от того, действительно ли у вас есть массив для индексации, - это неопределенное поведение (большую часть времени он даст вам ошибку сегментации, но также может вернуть значение, которое происходит в памяти в месте, которое может быть буквально любым, даже не гарантировано, что это тот же тип данных).


не компилируется - почему бы не 20?

Он не компилируется, потому что a является ни массивом, ни указателем. Какую семантику вы ожидаете при индексировании целого числа? Это просто не имеет смысла.

Кроме того: даже если вы использовали (&a)[1] (который компилируется), он бы не делать ничего хорошего - там ничего по адресу &a + 1, так как однолокальный a int, а не массив из два int s. Таким образом, ваша программа будет ссылаться на неопределенное поведение.


int a;
test(&a);

выделяет память для переменной int, оставляя ее неинициализированной и передает свой адрес функции test:

void test(int *b)
{
 b[0] = 10;
 b[1] = 20;
 printf("\n %i \n ",b[1]); // prints 20
}

который сначала инициализирует эту переменную до 10, но затем пытается получить доступ к int который следует в памяти (доступ к массиву из границ с помощью b[1]), что дает неопределенное поведение.


#include <stdio.h>

void test(int *b) // A function that takes a pointer to an int as an input
{
 b[0] = 10; // The value pointed to by b now equals 10 (value of a).
 b[1] = 20; // Not valid. memory at b[1] has not been allocated yet.
 printf("\n %i \n ",b[1]); 
}

int main( int argc, char* argv[] )
{
 int a; 
 test(&a); // call test giving address of a (pointer to a as input)
 printf("%i \n",a); //prints 10, this is because the value pointed by b is 10.
 //printf("%i \n",a[1]); //doesn't compile - a is not a pointer!
 return 0;
}
</stdio.h>

licensed under cc by-sa 3.0 with attribution.