繁体   English   中英

从C函数返回char指针

[英]Returning char pointer from C function

我需要帮助来检查我的代码是否正确。 该代码太大,无法完全包含,因此我将仅粘贴受影响的部分。

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每次调用都要Decode_URL


编辑更多信息:

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;
}

谢谢

当然,这取决于内存的来源, Decode_URL()返回的是指针。

如果它是静态数组,则可以使用。

如果它是动态分配的(通过malloc()或它的任何一个朋友),那么您正在泄漏内存。

它是正确的。 你也可以去

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

只要您不需要对数据做更多的事情,那么,为什么不呢?

我们真正需要知道的是Decode_URL为创建返回的char指针所指向的内存所做的工作,在这种情况下需要释放它,是否是malloc,在静态的情况下,您需要注意如何使用函数和作为函数返回的数据将不再是可重入的,也不是线程安全的。

这是正确的,因为您可能需要考虑使用tmp来进行其他用途

为此的宏:

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

并像这样使用它:

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

无论如何,您很高兴,宏只是一种更好的编码方式。

编辑:

看到添加的代码后,您确实遇到了内存问题。

这是您的宏应如下所示:

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

并像这样使用它:

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM