2014-11-18 2 views
1

Я столкнулся с несколькими проблемами при использовании указателей и статических массивов. Я застрял в этой ошибке:strlen pointer vs array

void LZWCompress(FILE* file, char minCodeSize, char *pixels, int area) 
{ 

int k = ++minCodeSize, i, len = DEFAULT, jump = 0, dicLen; 
lzwDict *dictionary = NULL, *s, *temp; 

char *curr, next[2], *buffer; 

dicLen = initializeDictionary(&dictionary, minCodeSize); 
for(i = 0; i < area; i++) 
{ 
    if(dicLen + 1 >= pow(2, k)) 
     k = k + 1; 

    curr = (char*) malloc(sizeof(char) * DEFAULT); 
    curr[0] = pixels[i]; 
    curr[1] = '\0'; 

    printf("strlen %lu %s\n", strlen(curr)); ### strlen(curr) = 0 ? WH ? ### 
    if((i + 1) > area) 
    { 
     //outputs curr 
     break; 
    } 


    len = len + 1; 
    jump = jump + 1; 

    next[0] = pixels[i + jump]; 
    next[1] = '\0'; 

    buffer = (char*) malloc(sizeof(char) * len); 
    printf("%lu %lu %lu \n", strlen(buffer), strlen(curr), strlen(next)); ### prints out "0 0 1" ### 

(...) код продолжается, и я получаю Прервать ловушку из-за этой проблемы

buffer = strcat(curr, next); 
    HASH_FIND_STR(dictionary, buffer, s); 

    if(s) 
    { 
     printf("YOLO\n"); 
     do{ 
      jump = jump + 1; 

      if(i + jump >= area) 
       exit(-1); 

      printf("%d \n", len); 
      curr = (char*) realloc(curr, sizeof(char) * len); ### Here i get Abort Trap 6 ### 

(...) код продолжает

Почему Я получаю ожидаемые результаты, когда я использую массив (следующий [2]), а не когда я использовал указатель (* curr, * buffer).

Я использую OSX Yosemite, если это необходимо.

+1

Каковы ожидаемые результаты и конкретная ошибка? – jruizaranguren

+0

Этот код ужасен. Что он должен делать? – trojanfoe

ответ

1

Согласно STRLEN doc:

Длина строки C определяются завершающим нуль-символ: AC струны до тех пор, как число символов между началом строки а завершающий нулевой символ (без включения конечного нулевого символа).

Не следует путать с размером массива, который содержит строку.

Если пикселей [я] равен 0, STRLEN (следующий) будет равен 0.