高效的内存分配和释放问题
Efficient Memory allocation and freeing question
我正在编写一个程序,打印一个已被删除的字符串白色 space。
此时,在removeWhiteSpace
函数中,我想知道内存分配和释放是否被有效地使用。
如果没有,您能否提出适当的改进建议:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *removeWhiteSpace();
int main()
{
char *inputString = malloc(sizeof(char) * 100);
scanf(" %[^\n]s", inputString);
removeWhiteSpace(inputString);
printf("%s\n", inputString);
free(inputString);
return 0;
}
char *removeWhiteSpace(char *inputString)
{
char *tempArray = malloc(sizeof(char) * 100);
char *tempPointer = strtok(inputString, " ");
while (tempPointer != NULL)
{
strcat(tempArray, tempPointer);
tempPointer = strtok(NULL, " ");
}
strcpy(inputString, tempArray);
free(tempArray);
return tempArray;
}
动态分配需要一些成本。动态分配如此小的固定大小数组看起来效率不高。 removeWhiteSpace
的 return 值也没有意义,因为它指的是已经释放的缓冲区。
简单地静态分配数组并且 removeWhiteSpace
return 什么都没有。
另请注意:
- 您应该声明函数的参数以避免错误。
- 你必须在使用
strcat
之前初始化数组 tempArray
。使用初始化器效率不高,因为它会初始化所有元素,而 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] = '[=10=]';
while (tempPointer != NULL)
{
strcat(tempArray, tempPointer);
tempPointer = strtok(NULL, " ");
}
strcpy(inputString, tempArray);
}
我会做一个tortoise and hare算法。
只复制不是 space.
的字符
char *removeWhiteSpace(char *inputString) {
char *in = inputString;
char *out = inputString;
// small optimization - do not copy to itself
while (*in != '[=10=]' && *in != ' ') {
in++;
out++;
}
for (; *in != '[=10=]'; in++) {
if (*in != ' ') {
*out++ = *in;
}
}
*out = '[=10=]';
return inputString;
}
我正在编写一个程序,打印一个已被删除的字符串白色 space。
此时,在removeWhiteSpace
函数中,我想知道内存分配和释放是否被有效地使用。
如果没有,您能否提出适当的改进建议:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
char *removeWhiteSpace();
int main()
{
char *inputString = malloc(sizeof(char) * 100);
scanf(" %[^\n]s", inputString);
removeWhiteSpace(inputString);
printf("%s\n", inputString);
free(inputString);
return 0;
}
char *removeWhiteSpace(char *inputString)
{
char *tempArray = malloc(sizeof(char) * 100);
char *tempPointer = strtok(inputString, " ");
while (tempPointer != NULL)
{
strcat(tempArray, tempPointer);
tempPointer = strtok(NULL, " ");
}
strcpy(inputString, tempArray);
free(tempArray);
return tempArray;
}
动态分配需要一些成本。动态分配如此小的固定大小数组看起来效率不高。 removeWhiteSpace
的 return 值也没有意义,因为它指的是已经释放的缓冲区。
简单地静态分配数组并且 removeWhiteSpace
return 什么都没有。
另请注意:
- 您应该声明函数的参数以避免错误。
- 你必须在使用
strcat
之前初始化数组tempArray
。使用初始化器效率不高,因为它会初始化所有元素,而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] = '[=10=]';
while (tempPointer != NULL)
{
strcat(tempArray, tempPointer);
tempPointer = strtok(NULL, " ");
}
strcpy(inputString, tempArray);
}
我会做一个tortoise and hare算法。 只复制不是 space.
的字符char *removeWhiteSpace(char *inputString) {
char *in = inputString;
char *out = inputString;
// small optimization - do not copy to itself
while (*in != '[=10=]' && *in != ' ') {
in++;
out++;
}
for (; *in != '[=10=]'; in++) {
if (*in != ' ') {
*out++ = *in;
}
}
*out = '[=10=]';
return inputString;
}