C 有效的内存分配和释放问题
我正在写一个程序,打印一个被删除了空白的字符串 此时,在C 有效的内存分配和释放问题,c,c99,C,C99,我正在写一个程序,打印一个被删除了空白的字符串 此时,在removewitspace函数中,我想知道内存分配和释放是否得到了有效利用 如果没有,您能否提出适当的改进建议: #包括 #包括 #包括 char*removeWhiteSpace(); int main() { char*inputString=malloc(sizeof(char)*100); scanf(“%[^\n]s”,输入字符串); 删除空白(inputString); printf(“%s\n”,inputString);
removewitspace
函数中,我想知道内存分配和释放是否得到了有效利用
如果没有,您能否提出适当的改进建议:
#包括
#包括
#包括
char*removeWhiteSpace();
int main()
{
char*inputString=malloc(sizeof(char)*100);
scanf(“%[^\n]s”,输入字符串);
删除空白(inputString);
printf(“%s\n”,inputString);
自由(输入字符串);
返回0;
}
char*removeWhiteSpace(char*inputString)
{
char*tempArray=malloc(sizeof(char)*100);
char*tempPointer=strtok(inputString,“”);
while(tempPointer!=NULL)
{
strcat(临时数组、临时指针);
tempPointer=strtok(空,“”);
}
strcpy(inputString,tempArray);
自由(临时数组);
返回数组;
}
动态分配需要一些成本。动态分配如此小的固定大小数组看起来效率不高。另外,removeWhiteSpace
的返回值也没有意义,因为它引用的是一个已经释放的缓冲区
只需静态分配数组,并让删除空白
不返回任何内容
还请注意:
- 您应该声明函数的参数以避免错误
- 您必须先初始化数组
,然后才能使用tempArray
。使用初始值设定项不会有效,因为它将初始化所有元素,而strcat
只需要初始化第一个元素strcat()
- 您应该通过
限制读取的最大长度,以避免缓冲区溢出scanf()
- 您不需要使用
格式的scanf()
,因为输入由s
指定,之后没有[
。scanf()
告诉s
在字符串后面使用scanf()
s
#include <stdio.h>
#include <string.h>
void removeWhiteSpace(char*);
int main()
{
char inputString[100];
scanf(" %99[^\n]", inputString);
removeWhiteSpace(inputString);
printf("%s\n", inputString);
return 0;
}
void removeWhiteSpace(char *inputString)
{
char tempArray[100];
char *tempPointer = strtok(inputString, " ");
tempArray[0] = '\0';
while (tempPointer != NULL)
{
strcat(tempArray, tempPointer);
tempPointer = strtok(NULL, " ");
}
strcpy(inputString, tempArray);
}
#包括
#包括
void-removeWhiteSpace(char*);
int main()
{
字符输入字符串[100];
scanf(“%99[^\n]”,inputString);
删除空白(inputString);
printf(“%s\n”,inputString);
返回0;
}
void removewitespace(char*inputString)
{
字符数组[100];
char*tempPointer=strtok(inputString,“”);
tempArray[0]='\0';
while(tempPointer!=NULL)
{
strcat(临时数组、临时指针);
tempPointer=strtok(空,“”);
}
strcpy(inputString,tempArray);
}
我会做一个算法。
仅复制不带空格的字符
char *removeWhiteSpace(char *inputString) {
char *in = inputString;
char *out = inputString;
// small optimization - do not copy to itself
while (*in != '\0' && *in != ' ') {
in++;
out++;
}
for (; *in != '\0'; in++) {
if (*in != ' ') {
*out++ = *in;
}
}
*out = '\0';
return inputString;
}
关于工作代码的问题最好在代码审查时提出,而不是免费的
free(tempArray);return tempArray;
是一个问题。您返回的是一个指向已释放内存的指针。根本不需要在removeWhiteSpace
中分配内存。当每个输出元素仅依赖于输入数组中的后续元素时,可以通过将输出写入同一数组来完成工作。removeWhiteS的两个定义速度不匹配。不要忽略编译器错误或警告。@EricPostpischil感谢您的友好回答。拥有printf malloc开销小于marginalWow!谢谢MikeCAT。正因为如此,我学到了很多。tempArray
不能大于inputString
,但后者可以大于100。因此char tempArray[(strlen(inputString)+1);
更好。这是一个糟糕的代码!它有固定大小的100个数组,但没有限制输入字符串为100个字符!我甚至没有说不需要中间数组来解决问题的事实…@goisak你只能从这个答案中学到坏习惯。很遗憾另一个(不正确)答案被接受,而不是这个。您的while
循环将无限运行,因为它不会更新指针位置。它也不会更新输出指针位置!它应该是:while(*in!='\0'&&&&*in!='''{in++;out++;}
如果您删除“小优化”,可能是最好的选择@谢谢!!!我出了个错误,不知道该怎么办,谢谢。