将 const char* 复制到 char 数组是如何工作的

问题描述 投票:0回答:2

我有一个代码,其中有一个缓冲区,我试图将 const 字符串复制到其中,如下所示:

#include <stdio.h>

typedef struct _BIGWORD {
    unsigned char Byte[53];//size of constant string
}BIGWORD;

int main() {
    char cBuffer[64] = { 0 };

    BIGWORD* bwBufferCast = (BIGWORD*)cBuffer;
    
    *bwBufferCast = *(BIGWORD*) { "I am trying to copy this whole text inside a buffer!" };

    printf("text: %s\n", cBuffer);

    return 0;
}

这工作正常,但我不知道如何。它是否逐个字节地复制常量字符串,是否一次性复制所有内容,还是只是巧合,它在那里并且我不会在实际场景中工作

我知道我可以创建字符数组,例如:

char cBuffer[64] = "this is an array!"
。我想根据需要将 const 字符串放入缓冲区中

我尝试在代码中添加一些其他常量字符串来检查它是否会影响结果,但它没有

c pointers casting
2个回答
0
投票

这工作正常,但我不知道如何。

如果它有效,它是通过执行未定义的行为来实现的。它可能很容易不起作用,或者间歇性地起作用,或者产生意想不到的副作用。您的编译器应该通过如下警告或错误来提示您:

nocpy.c: In function ‘main’:
nocpy.c:12:35: warning: initialization of ‘BIGWORD *’ {aka ‘struct _BIGWORD *’} from incompatible pointer type ‘char *’ [-Wincompatible-pointer-types]
     *bwBufferCast = *(BIGWORD*) { "I am trying to copy this whole text inside a buffer!" };
                                   ^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
nocpy.c:12:35: note: (near initialization for ‘(anonymous)’)

如果您的编译器没有发出有关该问题的警告,那么您应该调高其警告级别,直到发出警告,否则就使用更好的编译器。

另请注意,根据您的经验水平,您应该将所有警告视为错误。当你运行一个程序时,它似乎会做你想做的事,但这并不能作为断定它对于所有受支持的输入都是正确的或者它会在其他机器上按预期工作的安全基础。

它是否逐字节复制常量字符串,是否一次复制全部

一般来说,不存在“一次”复制大于机器字长的对象的情况。但是,您的硬件可能具有高效的、硬件辅助的内存到内存复制功能,因此在机器级别,可以通过几条设置指令执行复制,并再通过一条指令来实际执行复制。

或者这只是巧合,它在那里,我不会在真实场景中工作

存在行为不当的重大风险。该程序访问

char[64]
类型的对象,就好像它是
struct _BIGWORD
类型的对象一样,这会产生整个程序的未定义行为。不要这样做。

我知道我可以创建字符数组,例如:

char cBuffer[64] = "this is an array!"
。我想根据需要将 const 字符串放入缓冲区中

这就是

strcpy()
的用途。


0
投票
 *bwBufferCast = *(BIGWORD*) { "I am trying to copy this whole text inside a buffer!" };
  • 您创建指向 BIGWORD 类型指针的 复合文字
    ,并使用对 字符串文字
  • 的引用初始化此指针
  • 然后通过取消引用指向两个 struct 的指针来分配它们。由于结构是按值分配的,因此它会复制一个整个结构。
© www.soinside.com 2019 - 2024. All rights reserved.