C 内核中字符串文字的奇怪行为
Strange behavior with string literals in C kernel
我承认我是 C 语言的新手,但我认为我已经很好地理解了这些概念。尽管如此,我注意到字符串文字有一些奇怪的行为,我的 google 搜索似乎表明它不应该发生。是不是我遗漏了什么重要的东西,或者这是否表明我的内核存在一些潜在问题?当运行这个代码:
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 语言的新手,但我认为我已经很好地理解了这些概念。尽管如此,我注意到字符串文字有一些奇怪的行为,我的 google 搜索似乎表明它不应该发生。是不是我遗漏了什么重要的东西,或者这是否表明我的内核存在一些潜在问题?当运行这个代码:
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”。我不确定我为什么要这样做,这是在破坏文字!谢谢,我为我的愚蠢道歉。