我承认,我对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将内存从第一个参数复制到第二个参数,第三个参数中指定的长度.mostoc函数也是自定义的,但我有做了大量的测试,以确保它正常工作。)
我得到了这个输出:
<-- 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编译这些args:
-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);
}
}
答案 0 :(得分:2)
我很笨 - 感谢@Matthias建议使用objdump。这样做后,我意识到字符串文字与我的其余代码不同。更具体地说,我的代码在'.text'中,而文字在其他地方,不确定在哪里。作为我的Makefile的一部分,我正在做:
objcopy -O binary -j .text $< $@
注意'-j .text'。我不确定为什么我这样做,这是在诋毁文字!谢谢,我为我的白痴道歉。