Пока я работал над небольшим количеством кода на C, я наткнулся на эту странную ошибку.
Я допустил ошибку в своем коде и написал buf
вместо &buf
, но это сработало почти просто отлично.
...
void* buf;
int ret;
int fd = open("1", O_CREAT | O_RDWR, 0777);
write(fd, "test\n", 5);
lseek(fd, 0, SEEK_SET);
ret = read(fd, buf, 5); // Yes, this should be &buf
printf("Ret: %d Str: %s\n", ret, buf);
---- output ----
Ret: 5 Str: test\n
Этот код работает, и я получаю test\n
в моем stdout, даже при том, что у меня должен был быть &buf
в моем вызове чтения. Пожалуйста, я знаю, что изменение buf
на &buf
работает. Дело не в этом.
Вот что не работает:
...
void* buf;
void* blah = "a"; // Using char* still did not work
int ret;
int fd = open("1", O_CREAT | O_RDWR, 0777);
write(fd, "test\n", 5);
lseek(fd, 0, SEEK_SET);
ret = read(fd, buf, 5);
printf("Ret: %d Str: %s\n", ret, buf);
---- output ----
Ret: -1 Str: 1�I��^H��H���PTI��`@
Двоичный файл для файла 1
одинаков для обеих программ. Нет ошибок при записи 1
.
Почему работает первый фрагмент кода?
Как добавление переменной, которая никогда не используется, делает это больше не
работа
Почему запись в buf
, а не &buf
сработала?
Вот раздел строк в каждом двоичном файле:
Функциональный код:
0000770: 0100 0200 0000 0000 0000 0000 0000 0000 ................
0000780: 3100 7465 7374 0a00 4572 723a 2025 640a 1.test..Err: %d.
0000790: 0a00 5374 723a 2025 730a 0000 011b 033b ..Str: %s......;
00007a0: 3000 0000 0500 0000 34fd ffff 7c00 0000 0.......4...|...
Неисправный код:
0000770: 0100 0200 0000 0000 0000 0000 0000 0000 ................
0000780: 6100 3100 7465 7374 0a00 4572 723a 2025 a.1.test..Err: %
0000790: 640a 0a00 5374 723a 2025 730a 0000 0000 d...Str: %s.....
00007a0: 011b 033b 3400 0000 0500 0000 30fd ffff ...;4.......0...
Спасибо.