2013-04-26 3 views
0

Мне нужна помощь, чтобы проверить, действительно ли мой код. Код слишком велик, чтобы включить его полностью, поэтому я буду вставлять только затронутые части.Возвращающий указатель на указатель от функции C

char *tmp; 
tmp=Decode_URL(tmp_data); 
sprintf(Data,"%s",tmp); 
tmp=Decode_URL(tmp_backup1); 
sprintf(DataB[0],"%s",tmp); 
tmp=Decode_URL(tmp_backup2); 
sprintf(DataB[1],"%s",tmp); 
tmp=Decode_URL(tmp_backup3); 
sprintf(DataB[2],"%s",tmp); 
tmp=Decode_URL(tmp_backup4); 
sprintf(DataB[3],"%s",tmp); 
tmp=Decode_URL(tmp_backup5); 
sprintf(DataB[4],"%s",tmp); 

Decode_URL функция возвращает char *.

Так что мой вопрос: правильно ли всегда использовать tmp для получения char *, возвращаемого функцией? Или я должен создать больше char *tmpx, по одному для каждого звонка до Decode_URL?


EDIT для получения дополнительной информации:

char *Decode_URL(char *url){ 
     char *check; 
     check=EnDeCrypt(some vars here); 
     return check; 
} 

char *EnDeCrypt(const char *pszText, int iTextLen, const char *pszKey) 
{ 
    char *cipher; 
    int a, b, i=0, j=0, k; 
    int ilen; 
    int sbox[256]; 
    int key[256]; 

    ilen = strlen(pszKey); 

    for (a=0; a < 256; a++) 
    { 
     key[a] = pszKey[a % ilen]; 
     sbox[a] = a; 
    } 

    for (a=0, b=0; a < 256; a++) 
    { 
     b = (b + sbox[a] + key[a]) % 256; 
     swapints(sbox, a, b); 
    } 

    cipher = (char *)malloc(iTextLen); 

    for (a=0; a < iTextLen; a++) 
    { 
     i = (i + 1) % 256; 
     j = (j + sbox[i]) % 256; 
     swapints(sbox, i, j); 
     k = sbox[(sbox[i] + sbox[j]) % 256]; 
     cipher[a] = pszText[a]^k; 
    } 
    return cipher; 
} 

Благодаря

+0

его нормально с одним TMP !!! пока предыдущий не будет использован повторно. – akp

+0

зависит от того, как этот * char создан, стек мудрый, куча или возвращающий const. –

+0

, вероятно, до тех пор, пока возвращаемое значение не будет адресом локальной переменной 'Decode_url()' –

ответ

0

До тех пор, пока вы не должны делать ничего больше с данными, конечно, почему нет?

2

Это правильно. Вы могли бы также пойти с

sprintf(DataB[4],"%s",Decode_URL(tmp_backup5)) 
5

Это, конечно, зависит от того, где память приходит, что Decode_URL() возвращает указатель.

Если это статический массив, ваше использование в порядке.

Если это динамически распределено (по malloc() или любому из его друзей), вы теряете память.

+0

Это использование неопределенного поведения для статического массива, определенного в области 'Decode_URL'. – Paulpro

+2

+1 для упоминания утечки памяти. также добавление о возвращении адреса локального массива завершит ответ. –

+0

@Paulpro как так? стандартное время хранения хранителей статических объектов должно быть таким же, как и срок службы программы? –

0

Что нам нужно знать, так это то, что Decode_URL делает для создания памяти, на которую указывает возвращаемый указатель на char, является ли это malloc, в этом случае вам нужно будет его освободить, статично, в этом случае вам нужно быть осторожным как вы используете функцию и возвращаемые данные, поскольку функция не будет реентерабельной или потокобезопасной.

0

Это правильно, так как нет другого использования не делается ТМП, хотя вы могли бы хотеть рассмотреть

макрос для этого:

#define SET_TEMP(BACKUP, TMP, DATA) \ 
     TMP=Decode_URL(BACKUP);  \ 
     sprintf(DATA,"%s",TMP) 

и использовать его как это:

SET_TEMP(tmp_backup1, tmp, DataB[0]); 
... 

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

EDIT:

после просмотра добавленный вами код, у вас есть проблемы с памятью.

это как макрос должен выглядеть следующим образом:

#define SET_TEMP(BACKUP, TMP, DATA) \ 
     TMP=Decode_URL(BACKUP);  \ 
     sprintf(DATA,"%s",TMP);  \ 
     free(TMP) 

и использовать его как это:

SET_TEMP(tmp_backup1, tmp, DataB[0]); 
... 
Смежные вопросы