当在函数中声明相同的变量时,全局变量不起作用

时间:2019-04-05 02:11:46

标签: c memory memory-management global-variables

我正在尝试通过使用以下函数访问C语言中的视频内存,以在没有标准库的情况下将char *打印到屏幕上:

client.on('ready', msg => {
  client.channels.get("555945877483814915").send(`${players}`)
  .then((msg) => {
    setInterval(function() {
    msg.edit(`${players}`)
  }, 60000)}
  )}
)

代码按预期将变量c打印到屏幕上,但是当我将videohex声明为全局变量(我将在整个程序中使用此变量)时,使用以下代码:

int printchar(char c) {
        int videohex = 0xb8000;
        char* vidmem = (char*) videohex;
        *vidmem = c;
        videohex = videohex + 2;
}

什么都没打印出来。

我做错了什么?

1 个答案:

答案 0 :(得分:0)

区别在于您要在函数末尾递增videohex

当它是局部变量时,每次调用该函数时,它都会重新初始化为0xb8000

当它是一个全局变量时,它将保留两次调用之间的更新值。下次调用该函数时,它将写入另一个存储位置。最终,您会将其增加到视频内存的末尾。

您可能应该使用的是两个变量。一个指向视频存储器的底部,另一个指向当前字符的偏移量。您可以增加偏移量,到达终点时可以回绕到0

既不需要intchar *变量,也可以根据需要简单地初始化指针:

const char *video_base = (char *)0xb8000;
unsigned int video_offset = 0;
#define VIDEO_MAX 0x1000

int printchar (char c) {
    video_base[video_offset] = c;
    video_offset += 2;
    if (video_offset >= VIDEO_MAX) {
        video_offset = 0;
    }
}