[英]C String concatenation issue function
我有点需要做一些C-String连接,所以我决定自己学习(这只是一个个人项目,所以我一直都在世界上,真的)。
到目前为止,我已经提出了这两个函数(下面给出解释):
static inline // make inline to leave out the stack manipulation
size_t StrLength( const char* string )
{
return strnlen( string, strlen( string ) );
}
static void concatstr( char** dest, const char** src )
{
const size_t destlen = StrLength( *dest );
const size_t srclen = StrLength( *src );
const size_t total_len = destlen + srclen;
const size_t totalLenNull = total_len + 1;
char* tmp = ( char* )malloc( sizeof( char ) * totalLenNull ); //<-- Because of this...
size_t counter = 0;
for( size_t iDest = 0; iDest < destlen; ++iDest )
tmp[ counter++ ] = *dest[ iDest ];
for ( size_t iSrc = 0; iSrc < srclen; ++iSrc )
tmp[ counter++ ] = *src[ iSrc ];
*dest = ( char* ) realloc( *dest, totalLenNull );
strncpy( *dest, tmp, total_len );
free( tmp );
tmp = NULL;
}
内联StrLength函数背后的想法是,如果我正确理解内联,它应该像C ++中更安全的宏一样工作,所以它不易出错(我认为)。 我把它作为内联,因为它只是一行代码,并且对于那种进程的堆栈操作似乎有点多。 但是,如果我错了,请在此纠正我。
现在,进入concatstr()
函数:
这里的问题是,当我到达第二个循环时,由于内存读取违规,程序在第二次迭代时崩溃。 为什么会这样,我不确定。
调用代码如下所示:
const size_t len = StrLength( msg ) + mPrefix.length() + StrLength( "\n\n" );
char* out = ( char* )malloc( sizeof( char ) * ( len + 1 ) );
out[0] = '\0';
const char* tmp_pass = mPrefix.c_str();
concatstr( &out, &tmp_pass );
concatstr( &out, &msg );
我在这里放置visual-C ++标签的唯一原因是,即使我这样做就像直接c一样,我使用VC ++作为编译器。
有谁知道这里的问题是什么?
你的优先权是错的,
tmp[ counter++ ] = *dest[ iDest ];
是(隐含地)parethesised
tmp[ counter++ ] = *(dest[ iDest ]);
但你需要
tmp[ counter++ ] = (*dest)[ iDest ];
用明确的括号。
如果没有括号,在*dest
之后的iDest * sizeof(char*)
字节的偏移处的(假定的) char*
被取消引用,可能没有允许取消引用的有效char*
。 您希望在*dest
指向的位置之后以iDest
字节的偏移量访问该字节。
在末尾,
strncpy( *dest, tmp, total_len );
不会终止连接的字符串。 那里你需要totalLenNull
。
在旁边:
return strnlen( string, strlen( string ) );
相当谨慎。 首先,遍历string
以查找终止的0字节,在此之前计算char
。 然后,你检查是否有第一之间的终止0字节strlen(string)
的字节string
。 除非在这两个调用之间修改string
(然后你可能已经被软化),否则第二个将返回与第一个调用完全相同的string
。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.