C 复制没有空间的字符串时内存访问错误

C 复制没有空间的字符串时内存访问错误,c,string,function-calls,memory-access,C,String,Function Calls,Memory Access,这就是我的结构 typedef struct { int startIndex; int length; char *rawString; }Tokenizer; 我得到了一个复制字符串的函数(它将删除空格) 现在,此代码将返回错误的内存访问。 我有这么长时间的故障排除,无法解决。 有人想帮我吗?请注意,C字符串以空字符结尾,并且strlen不考虑此字符,这意味着它在内存中的大小实际上是strlen(source)+1 您需要做的是按如下方式分配缓冲区: destin

这就是我的结构

typedef struct {
    int  startIndex;
    int length;
    char *rawString;
}Tokenizer;
我得到了一个复制字符串的函数(它将删除空格)

现在,此代码将返回错误的内存访问。 我有这么长时间的故障排除,无法解决。
有人想帮我吗?

请注意,C字符串以空字符结尾,并且
strlen
不考虑此字符,这意味着它在内存中的大小实际上是
strlen(source)+1

您需要做的是按如下方式分配缓冲区:

destination = malloc (strlen(source) + 1);
*destination = malloc (strlen(source) + 1);
if (source[i] != ' ' && source[i] != '\t')
sizeof(char)
由C标准保证为1,因此您可以安全地忽略它

另外,您正在修改
copyStringWithoutSpace
函数中
destination
变量的值,这意味着新分配的内存将无法从函数外部看到,这将导致内存泄漏

您需要返回指针并具有以下签名:

char * copyStringWithoutSpace(char *source)
或者:

void copyStringWithoutSpace(char *source, char ** destination)
您必须按如下方式分配内存:

destination = malloc (strlen(source) + 1);
*destination = malloc (strlen(source) + 1);
if (source[i] != ' ' && source[i] != '\t')
这里的另一个错误是:
if(!(source[i]='')| |(source[i]='\t'))

由于运算符的优先级,这不符合您的要求。此处,否定运算符仅应用于以下一对括号,这意味着您的测试可以拼写为:

如果源[i]不是空格,或者源[i]是表格

你应该这样写:

destination = malloc (strlen(source) + 1);
*destination = malloc (strlen(source) + 1);
if (source[i] != ' ' && source[i] != '\t')
哪个更清楚,不是吗


然后,正如在一篇评论中指出的,在每次迭代时调用
strlen
是非常低效的,因为整个字符串都需要迭代到空字符。

这段代码非常麻烦,同时速度也很慢
strlen()
for
循环的每次迭代中:-)只查询一次字符串的长度。