5

文字ポインターからのデータで文字配列を初期化したかったのです。このために次のコードを書きました。

(私が構造とすべてでやっていることを親切に許してください..実際には、このコードはより大きなものに収まるはずなので、その構造とその使用の奇妙さ)

#include <iostream>
#include <string>

struct ABC 
{
    char a;
    char b;
    char c[16];
};

int main(int argc, char const *argv[])
{
    struct ABC** abc;
    std::string _r = "Ritwik";
    const char* r = _r.c_str();

    if (_r.length() <= sizeof((*abc)->c))
    {
        int padding = sizeof((*abc)->c) - _r.length();

        std::cout<<"Size of `c` variable is : "<<sizeof((*abc)->c)<<std::endl;
        std::cout<<"Value of padding is calculated to be : "<<padding<<std::endl;

        char segment_listing[ sizeof((*abc)->c)]; 

        std::cout<<"sizeof segment_listing is "<<sizeof(segment_listing)<<std::endl;

        memcpy(segment_listing, r, _r.length());
        memset( (segment_listing + _r.length()), ' ', padding);

        std::cout<<segment_listing<<std::endl;

    }
    return 0;
}

ただし、コードを実行すると、文字列の最後にこれらの奇妙な文字が表示されます。

(rh4dev01:~/rough) rghosh> ./crptr
Size of `c` variable is : 16
Value of padding is calculated to be : 10
sizeof segment_listing is 16
Ritwik          °×
(rh4dev01:~/rough) rghosh> ./crptr
Size of `c` variable is : 16
Value of padding is calculated to be : 10
sizeof segment_listing is 16
Ritwik           Ñ
(rh4dev01:~/rough) rghosh> ./crptr
Size of `c` variable is : 16
Value of padding is calculated to be : 10
sizeof segment_listing is 16
Ritwik          g
(rh4dev01:~/rough) rghosh> ./crptr
Size of `c` variable is : 16
Value of padding is calculated to be : 10
sizeof segment_listing is 16
Ritwik          pô
(rh4dev01:~/rough) rghosh> ./crptr
Size of `c` variable is : 16
Value of padding is calculated to be : 10
sizeof segment_listing is 16
Ritwik
(rh4dev01:~/rough) rghosh> ./crptr
Size of `c` variable is : 16
Value of padding is calculated to be : 10
sizeof segment_listing is 16
Ritwik          àå
(rh4dev01:~/rough) rghosh> ./crptr
Size of `c` variable is : 16
Value of padding is calculated to be : 10
sizeof segment_listing is 16
Ritwik           »
(rh4dev01:~/rough) rghosh> ./crptr
Size of `c` variable is : 16
Value of padding is calculated to be : 10
sizeof segment_listing is 16
Ritwik          pZ

なぜそれが起こっているのか説明していただけますか?長さがわずか16文字の文字配列のみを印刷しているので、16文字だけが印刷されるべきではありませんか? これらの 2 つの文字 (ゼロの場合もあれば 1 つの場合もあります) はどこから来ているのでしょうか?

cさらに重要なことは、パディングによって メモリ (文字配列に属していない) を破損していませんか?

4

4 に答える 4

2

AC 文字列は、どこにも説明していない 0 バイトで終了します。文字列を値 0 で終了する必要があり、すべての計算でその余分なバイトを考慮する必要があります。

于 2013-05-30T17:37:57.253 に答える
2

null 文字はありませんsegment_listing

于 2013-05-30T17:38:00.120 に答える
-1
const int SIZE = 16;  //or 17 if you want 16 + null char
//pre-initialise array - then will automatically be null terminated
char segment_listing[SIZE] = {0};
于 2013-05-30T17:46:19.183 に答える