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
循环的每次迭代中:-)只查询一次字符串的长度。