memcpy()
またはを使用できstrcpy()
ますが、境界チェックを自分で行う必要があり、コードに他のエラーがあります。
char[16]
したがって、NSStringを配列にコピーしたいと思います。組み込みのメソッドを使用してこれを行うことができ、自分NSString
で使用する必要はありません。memcpy()
NSString *src;
char dest[16];
NSUinteger destlen;
[src getBytes:dest
maxLength:sizeof(dest) - 1
usedLength:&destlen
encoding:NSUTF8StringEncoding
options:0
range:NSMakeRange(0, [src length])
remainingRange:NULL];
dest[destlen] = '\0';
を使用する場合はmemcpy()
、次のようにする必要があります。
NSString *src;
char dest[16], *srcUtf8;
size_t len;
srcUtf8 = [src UTF8String];
len = strlen(srcUtf8);
if (len >= sizeof(dest))
len = sizeof(dest) - 1;
memcpy(dest, srcUtf8, len);
dest[len] = '\0';
コードのエラー
このコードには2つのエラーがあります!
memcpy(&profile.friendly_name, &string, 16); // Wrong!
まず第一に、&string
間違っています。string
は、コピーする文字列データへのポインタであるため、である必要がありstring
ます。をコピー&string
すると、代わりにポインタとスタックデータのランダムビットがコピーされます。言い換えれば、あなたはゴミを得るでしょう。
第二に、16は間違っています。string
少なくとも16バイトのデータを指していることがわかっている場合にのみ、16バイトをコピーできます。string
これにより、 16バイト未満の場合、メモリ内の次のデータが読み取れない場合、セグメンテーション違反(プログラムのクラッシュ、ハード)が発生します。今日はクラッシュしないかもしれませんが、来週はクラッシュするかもしれません。あなたはそれについてすべて忘れているでしょうか?
間違っています。ソースの長さが16バイト以上であることがわかっている場合を除いて、16を渡さないでください。