gpt4 book ai didi

c - C 内核中字符串文字的奇怪行为

转载 作者:行者123 更新时间:2023-12-04 22:35:30 26 4
gpt4 key购买 nike

我承认,我是 C 语言的新手,但我认为我已经很好地理解了这些概念。尽管如此,我注意到字符串文字有一些奇怪的行为,我的谷歌搜索似乎表明它不应该发生。是不是我遗漏了什么重要的东西,或者这是否表明我的内核存在一些潜在问题?运行此代码时:

debug_print("Directly in parameter.");

char test1[] = "With array.";
debug_print(test1);

char* test2 = "With pointer.";
debug_print(test2);

char test3[] = "With array, then pointer.";
char* test3_1 = &test3[0];
debug_print(test3_1);

char* test4 = "With pointer, then malloc.";
char* test4_1 = malloc(27);
memory_copy(test4, test4_1, 27);
debug_print(test4_1);

char test5[] = "With array, then malloc.";
char* test5_1 = malloc(25);
memory_copy(test5, test5_1, 25);
debug_print(test5_1);

(debug_print 将一个 const char* 作为参数,并将其打印到 serial0。memory_copy 将内存从第一个参数复制到第二个,长度在第三个参数中指定。malloc 函数也是自定义的,但我有进行了广泛的测试以确保其正常工作。)

我得到这个输出:

                               <-- There is a null string here...
With array.
<-- There is a null string here...
With array, then pointer.
<-- There is a null string here...
With array, then malloc.

如果字符串文字最初没有存储为 char 数组,那么它似乎会被忽略。为什么会这样?如果有帮助,我将使用这些参数使用 gcc 进行编译:

-ffreestanding -g -std=c99 -m32 -masm=intel -Wall

编辑:根据要求,这是我的 debug_print 代码:

void debug_print(const char* message) {
for (int i = 0;message[i] != 0;i++) port_byte_out(0x3F8, message[i]);
port_byte_out(0x3F8, '\r');
port_byte_out(0x3F8, '\n');
}

另外,这里是 memory_copy,因为我没有意识到它类似于标准的 c 函数。

void memory_copy(const char* source, char* dest, int no_bytes) {
int i;
for (i = 0; i < no_bytes; i++) {
*(dest + i) = *(source + i);
}
}

最佳答案

嗯,我很笨——感谢@Matthias 建议使用 objdump。这样做之后,我意识到字符串文字与我的其余代码位于不同的部分。更具体地说,我的代码在“.text”中,而文字在其他地方,不确定确切位置。作为我的 Makefile 的一部分,我正在做:

objcopy -O binary -j .text $< $@

注意“-j .text”。我不确定我为什么要这样做,这是在破坏文字!谢谢,我为我的愚蠢道歉。

关于c - C 内核中字符串文字的奇怪行为,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49516349/

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