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++;}
如果您删除“小优化”,可能是最好的选择@谢谢!!!我出了个错误,不知道该怎么办,谢谢。