Проверка значений в куче - PullRequest
0 голосов
/ 28 октября 2009

Я пытаюсь проверить в куче char * c = s - sizeof (без знака); Но это всегда возвращает мне бред. Мне интересно, что я сделал не так ...

    typedef 
    struct String {
     int length;
     int capacity;
     unsigned check;
     char ptr[0];
    } String;

char* modelStrrealloc(char* myStruct, int new_capacity){
 char* c = myStruct - sizeof(unsigned);
 int length = strlen(s);
 String *string;
 if (c == 0xdeadbeef ){
  printf("1st if statement");
  if (*(c - sizeof(int))< new_capacity){
   string = malloc(sizeof(String) + new_capacity + 1);

   printf("if statement");
   assert(string != 0);
     (*string).length = length;
     (*string).capacity = new_capacity + 1;
      strcpy(string->ptr, myStruct);
   (*string).check = "~0xdeadbeef";
   modelStrfree(myStruct);
   return string->ptr;
  }
  }
  return myStruct;
}

1 Ответ

1 голос
/ 28 октября 2009

ИМХО, чек для 0xdeadbeef должен читаться как

 if (*(unsigned*)c == 0xdeadbeef ){

и чек на вместимость

  if (*(int*)(c - sizeof(int))< new_capacity){

Как у вас есть, вы читаете отдельные символы вместо целых, и я думаю, что вы не собирались этого.

(я предполагаю, что myStruct должен быть указателем на строку ptr в struct Mystruct - это единственный способ, который имеет для меня смысл)

Также обратите внимание, что это на самом деле не переносимый Си, потому что компилятор может свободно добавлять отступы для выравнивания членов структуры - возможно, подход Беррета будет заключаться в использовании макроса offsetof и получении указателя на всю структуру. 1016 *

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...