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

时间:2018-03-27 15:00:53

标签: c kernel string-literals

我承认,我对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);
    }
}

1 个答案:

答案 0 :(得分:2)

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

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

注意'-j .text'。我不确定为什么我这样做,这是在诋毁文字!谢谢,我为我的白痴道歉。