Как правильно инициализировать указатели - PullRequest
1 голос
/ 21 июля 2011

У меня есть следующий код, который вызывает функцию uint32_pack. Эта программа компилируется без ошибок в Dev-C ++, но не дает правильного результата, когда «tag» является четным числом. В Visual Studio программа компилируется, но выдает ошибки, и я предполагаю, что именно из-за этих ошибок я не получаю правильный вывод, когда тег является четным. Я все еще пытаюсь разобраться с указателями, и я не уверен, где я ошибся, когда объявлял их. Спасибо за вашу помощь.

Вот код, из которого происходят ошибки:

 1  int uint32_pack (uint8_t *fieldnumber, uint32_t value, uint8_t *out);
 2  int main(){
 3  uint32_t initvalue = 2;
 4  int return_rv;  
 5  uint8_t *tag = (uint8_t *) malloc(sizeof(uint8_t));
 6  *tag = 38;
 7  uint8_t *tempout= (uint8_t *) malloc(30);
 8  return_rv = uint32_pack (tag, initvalue, tempout);
 9  free(tempout);
10  free(tag);
11  }

А ошибки от VS таковы:

error C2143: syntax error : missing ';' before 'type' (on line 7)
error C2065: 'tempout' : undeclared identifier        (on line 8)
warning C4047: 'function' : 'unsigned char *' differs in levels of indirection from 'int' (on line 8)
warning C4024: 'uint32_pack' : different types for formal and actual parameter 3 (on line 8) 
error C2065: 'tempout' : undeclared identifier  (on line 9)
warning C4022: 'free' : pointer mismatch for actual parameter 1 (on line 9)

Ответы [ 2 ]

2 голосов
/ 21 июля 2011

Последние три ошибки являются следствием второй, а вторая - следствием первой. Это только оставляет первое и третье необъяснимым.

Первая ошибка возникает из-за того, что вы используете C89, а не C ++ или C99; Вы не можете объявлять переменные после кода в C89.

Поменяйте порядок строк 6 и 7, и у вас, вероятно, все будет в порядке. (Я думаю, что третья ошибка также является следствием первой, но она не является окончательной.)

1 голос
/ 21 июля 2011

Здесь может быть несколько разных проблем. Если у вас нет собственного заголовка, который объявляет эти целые типы, типы <integer>_t объявляются в стандартном заголовке stdint.h. Visual Studio не поставляется с этим заголовком, поэтому он не знает, что это за типы. Вы можете найти реализации stdint.h, если вы Google.

Если ваш файл имеет расширение .c, Visual Studio по умолчанию скомпилирует его как файл C. Кроме того, он не поддерживает синтаксис C99, поэтому вы не можете объявлять переменные посреди исполняемого кода. Либо переместите все ваши объявления в начало функции, либо заставьте VS скомпилировать файл как C ++. Для этого либо переименуйте файл, либо в свойствах файла есть опция, позволяющая вам сделать это.

...