我应该如何更改变量BinaryNumber
,这样函数就不会给我警告消息。我知道由于内存的原因,我不能返回局部变量的地址。我应该使用malloc
吗?或者你认为我应该如何更改变量BinaryNumber
以便返回它?
char *Functoin_chang_string_ToBinary(char *Line) {
char *space = " ", *point = ",";
char BinaryNumber[Array_Size] = { "000000000000000" };
char *word = strtok(Line,""");
int num = 0, flag = 2, j = 11;
for (int i = 0; i < strlen(Line) - 1; i++) {
if (word[i] == '"') {
flag--;
i++;
}
num = word[i];
j = 14;
while (num != 0) {
BinaryNumber[j--] += (num % 2);
num /= 2;
}
printf("%sn", BinaryNumber);
Fill_Struct_Binary_Machine_Code("", BinaryNumber);
strcpy(BinaryNumber, "000000000000000");
}
printf("%sn", BinaryNumber);
Fill_Struct_Binary_Machine_Code("", BinaryNumber);
return BinaryNumber;
}
尽管可以使用malloc()
为BinaryNumber
字符串分配缓冲区(当然,这需要由调用方使用free()
释放(,但一个简单得多的方法是使用strdup()
函数。
这将在一次调用中分配复制作为其参数给定的字符串(包括nul
终止符(和复制实际字符串数据所需的精确内存量。
因此,您可以将函数的返回语句更改为:
return strdup(BinaryNumber);
当然,调用方在处理完返回的数据后仍然需要调用free()
(strdup
以与malloc
函数兼容的方式分配内存(。
是的,您可以返回一个指向malloc
分配的内存的指针。
或者,您可以将Functoin_chang_string_ToBinary
的功能原型更改为以下内容:
void Functoin_chang_string_ToBinary(char *Line, char *BinaryNumber );
这样,调用函数可以将内存分配为本地数组,并将指向该数组的指针传递给函数Functoin_chang_string_ToBinary
,例如:
BinaryNumber[Array_Size];
Functoin_chang_string_ToBinary( Line, BinaryNumber );
然而,当像这样将指针传递到内存缓冲区时,确保被调用的函数不会写过缓冲区的边界也是很重要的。出于这个原因,如果被调用的函数知道它所传递的缓冲区的大小会更好。因此,您可能还想通过将函数原型更改为以下内容来将缓冲区的大小传递给函数:
void Functoin_chang_string_ToBinary(char *Line, char *BinaryNumber, int BinaryNumberSize )
调用函数的代码将更改为以下代码:
BinaryNumber[Array_Size];
Functoin_chang_string_ToBinary( Line, BinaryNumber, ArraySize );
这样,被调用的函数可以通过访问其第三个参数来确定内存缓冲区的大小。
更改函数签名以接受目标并将其保存到:
char *Function_chang_string_ToBinary_r(char *Line, char *out, size_t out_size )
无论何时,提供最大输出大小都要安全得多,以免超出目标。您还可以使用大小敏感的副本复制到目标,将副本限制在目标区域(即您的内部工作区域(中较小的区域。
查看一个模型的strtok()
与strtok_r()
函数,该函数切换到此模型以实现线程安全。
是的,malloc()
会起作用,但我倾向于认为函数中的malloc()
调用是一个坏主意,尤其是对于短字符串。[1] 如果调用方忘记释放您分配的内存,它会让调用方面临内存泄漏,而[2]如果频繁调用函数,malloc((可能会有很高的开销。传入NULL指针可能会使函数调用malloc()
返回新地址。这样,任何内存泄漏或性能错误都会出现在调用者身上。