【发布时间】:2022-10-14 23:28:21
【问题描述】:
通常我用 PHP 开发。但是对于一个项目,我必须用 C 开发一个小程序(在 Windows 上使用 Visual Studio) 为了简化我的代码,我创建了一个返回字符串的函数(该函数比示例中的更复杂)。
最初我有一个警告C4172: returning address of local variable or temporary [duplicate]
我修改了我的功能,不再有这个警告。它有效。
但是代码对吗...?
#include<stdio.h>
#include<stdlib.h>
#include<string.h>
// Declaration Function
char* getMyString();
//----------------------------//
// Function getMyString() //
//----------------------------//
char* getMyString()
{
char* response = NULL;
response = (char*)malloc(5 * sizeof(char)); if (response == NULL) exit(EXIT_FAILURE);
strcpy(response, "EFGH");
return response;
}
//--------------------------------------------------//
// Main Program //
//--------------------------------------------------//
int main(int nbArg, char** listeArg)
{
// Initialization
char* myStringFull = malloc(10 * sizeof(char)); if (myStringFull == NULL) return EXIT_FAILURE;
char* myString = NULL;
// Get String with Personnal Function
myString = getMyString();
// Finalization
strcpy(myStringFull, "ABCD");
strcat(myStringFull, myString);
// Display
printf("\n%s\n\n", myStringFull);
// Free Memory
free(myStringFull);
free(myString);
return(EXIT_SUCCESS);
}
如果上面的代码是正确的,我可以使用下面的代码来进一步简化我的代码......? 如果我可以它是如何在内存中发生的,因为对于最后一个代码,我无法释放函数使用的内存
int main(int nbArg, char** listeArg)
{
// Initialization
char* myStringFull = malloc(10 * sizeof(char)); if (myStringFull == NULL) return EXIT_FAILURE;
// Finalization
strcpy(myStringFull, "ABCD");
strcat(myStringFull, getMyString());
// Display
printf("\n%s\n\n", myStringFull);
// Free Memory
free(myStringFull);
return(EXIT_SUCCESS);
}
希望我的问题不是太傻,但是 PHP 和 C 之间存在巨大的、巨大的、深不可测的差距 :)
【问题讨论】:
-
任何你
malloc但不free的东西都是内存泄漏。在像这样的小程序中,它不会做任何太有问题的事情,因为程序会立即结束(并且内存将被操作系统回收),但在更大、运行时间更长的程序中,它可能会导致问题(例如用完记忆) -
@UnholySheep - 所以我的第二个代码(仍然更容易阅读)不正确......?我必须通过 malloc() 的变量然后 free() ...?
-
第二种情况的解决方案是将指针与分配的大小一起传递给函数。然后函数可以根据需要重新分配,然后连接然后返回指针。重新分配的指针可以在没有内存泄漏的情况下被释放。
标签: c string function memory memory-management