Массив B[]
только живет , когда function()
работает (это local ). После возврата он не ссылается.
Если текст вашей задачи точно указан в кавычках, похоже, вам придется копаться в malloc. И тогда я скажу сейчас:
- Не разыгрывает malloc
- free () после завершения
Причина использования malloc после текста :
"Возвращает новый массив"
«Принимает только массив и счетчик» , а не третий параметр или повторное использование A .
И не поддавайтесь искушению использовать глобальный массив;), разве вам разрешено использовать статические? - (Правка: у @Clifford есть хорошие моменты, почему-нет)
Удачи!
Редактировать:
Также: вы не «получаете адрес памяти вместо значения» .
Когда вызывается function()
, ему присваивается адрес для возврата. Во-вторых, память для переменных local в этой функции зарезервирована, а их обозначения даны по адресу. То есть. что-то вроде:
/* assuming 4 byte int */
[ 0xA4 ... 0xAF ] <-- int B[3] -- 3 * 4 = 12 bytes
[ 0xB0 ... 0xB4 ] <-- int i -- 4 bytes
[ 0xB5 ... 0xB9 ] <-- int j -- 4 bytes
[ 0xBA ... 0xBE ] <-- int temp -- 4 bytes
Когда функция возвращает, эти области освобождаются. Поскольку нет смысла использовать питание для стирания данных, они остаются там, но могут в любой момент быть перезаписаны, когда другая операция использует область.
т.е. из вашего кода это может быть printf()
или это может быть что-то совершенно другое. Дело в том, что он не зарезервирован и может использоваться для "что угодно" . (Не делаю блины, но я думаю, вы поняли это).
Итак, когда вы печатаете свои значения func
и получаете 2 правильных и одно неправильное, это означает, что два первых еще не были перезаписаны, а последний был перезаписан другим вызовом. Это может даже быть в использовании.
Последнее значение не является адресом, а другим значением, интерпретируемым как целое число. Это также не должно быть int. Если другая функция записывает в эту область короткий int или символ (наиболее вероятно, 4 байта), то вы читаете 4 байта и интерпретируете биты как int.
Скажи:
B[2] == 6 (on a 4 bytes, int 32, system)
Address: 0xAC 0xAD 0xAE 0xAF As bit sequence
Value : 6 0 0 0 ==> [0000 0110 0000 0000 0000 0000]
Возвращение на главную , fun[2] -> [0xC 0xD 0xE 0xF]
Где-то еще функция определяет char
(1 байт) и получает теперь свободный адрес 0xD
По этому адресу записывается значение 123.
Теперь у нас есть:
fun[2]:
Address: 0xAC 0xAD 0xAE 0xAF As bit sequence
Value : 6 123 0 0 ==> [0000 0110 0111 1011 0000 0000]
Или, если мы переведем это в системе с прямым порядком байтов (например, моей), в целое число, мы получим
+--------- Least significant byte
|
Address: 0xAC 0xAD 0xAE 0xAF
Value : 6 123 0 0 ( == 0x06 0x7B 0x00 0x00 )
Sort to "human Anglo left right order"
0 0 123 6 => 0x00007B06 == 31494 (int, "normal human number"), and the number
you print when doing the for() loop in
main.
Также возможно, что рассматриваемые байты используются как
+----- bytes of fun[2]
|
_________+_________
[ ]
char foo 0xAC |
int bar 0xAD 0xAE 0xAF 0xB0
[____+______________]
|
+---- bytes of bar
Тот факт, что числа 1 и 2 верны, не является ни гарантией того, что байты не были изменены. Такое же значение может быть записано в местоположение. 0 может быть записано в байт 2 целого и т. Д.
Пылесос, чтобы показать:
Надеюсь, вы получите как минимум 1% от этого. Я активно учусь сам, и объяснения часто учатся :)