[英]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.