gpt4 book ai didi

c - 静态字符串文字的内存分配

转载 作者:太空狗 更新时间:2023-10-29 16:06:21 27 4
gpt4 key购买 nike

考虑以下结构:

struct example_t {
char * a;
char * b;
};

struct example_t test {
"Chocolate",
"Cookies"
};

我知道为 char* 分配内存的具体实现性质,但是字符串文字呢?

在这种情况下,对于“Chocolate”和“Cookies”的相邻放置,C标准有什么保证吗?

在我测试的大多数实现中,两个文字没有填充,并且直接相邻。

这允许使用 memcpy 快速复制结构,尽管我怀疑这种行为是未定义的。有人有关于这个主题的任何信息吗?

最佳答案

在您的示例中,没有绝对保证两个字符串文字相对于彼此的邻接/位置。在这种情况下,GCC 恰好展示了这种行为,但它没有义务展示这种行为。

在这个例子中,我们没有看到填充,我们甚至可以使用未定义的行为来演示字符串文字的邻接性。这适用于 GCC,但使用备用 libc 或不同的编译器,您可能会得到其他行为,例如检测跨翻译单元的重复字符串文字并减少冗余以节省最终应用程序中的内存。

此外,虽然您声明的指针是 char * 类型,但文字实际上应该是 const char*,因为它们将存储在 RODATA,写入该内存将导致段错误。


代码 list


#include <stdio.h>
#include <string.h>

struct example_t {
char * a;
char * b;
char * c;
};


int main(void) {

struct example_t test = {
"Chocolate",
"Cookies",
"And milk"
};
size_t len = strlen(test.a) + strlen(test.b) + strlen(test.c) + ((3-1) * sizeof(char));

char* t= test.a;
int i;
for (i = 0; i< len; i++) {
printf("%c", t[i]);
}

return 0;
}

示例输出


./a.out 
ChocolateCookiesAnd milk

gcc -S 的输出


    .file   "test.c"
.section .rodata
.LC0:
.string "Chocolate"
.LC1:
.string "Cookies"
.LC2:
.string "And milk"
.text
.globl main
.type main, @function
main:
.LFB0:
.cfi_startproc
pushq %rbp
.cfi_def_cfa_offset 16
.cfi_offset 6, -16
movq %rsp, %rbp
.cfi_def_cfa_register 6
pushq %rbx
subq $72, %rsp
.cfi_offset 3, -24
movq $.LC0, -48(%rbp)
movq $.LC1, -40(%rbp)
movq $.LC2, -32(%rbp)
movq -48(%rbp), %rax
movq %rax, %rdi
call strlen
movq %rax, %rbx
movq -40(%rbp), %rax
movq %rax, %rdi
call strlen
addq %rax, %rbx
movq -32(%rbp), %rax
movq %rax, %rdi
call strlen
addq %rbx, %rax
addq $2, %rax
movq %rax, -64(%rbp)
movq -48(%rbp), %rax
movq %rax, -56(%rbp)
movl $0, -68(%rbp)
jmp .L2
.L3:
movl -68(%rbp), %eax
movslq %eax, %rdx
movq -56(%rbp), %rax
addq %rdx, %rax
movzbl (%rax), %eax
movsbl %al, %eax
movl %eax, %edi
call putchar
addl $1, -68(%rbp)
.L2:
movl -68(%rbp), %eax
cltq
cmpq -64(%rbp), %rax
jb .L3
movl $0, %eax
addq $72, %rsp
popq %rbx
popq %rbp
.cfi_def_cfa 7, 8
ret
.cfi_endproc
.LFE0:
.size main, .-main
.ident "GCC: (Ubuntu 4.8.4-2ubuntu1~14.04) 4.8.4"
.section .note.GNU-stack,"",@progbits

关于c - 静态字符串文字的内存分配,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/32463719/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com