我想看看 1970 年 1 月 1 日的 00:00:00 是否实际上对应于 0 秒,我写了以下内容:
#include <stdio.h>
#include <time.h>
int main(void) {
int year = 1970;
struct tm t = {0};
t.tm_mday = 1; // January
t.tm_year = year - 1900;
t.tm_hour = 0;
t.tm_isdst = -1;
printf("%ld\n", mktime(&t));
return 0;
}
Run Code Online (Sandbox Code Playgroud)
它给我的值为-3600。我哪里错了?
PS:使用 GCC v.10.1 进行测试。我尝试在另一个架构下使用另一个编译器,它给了我正确的值。
我试图弄清楚为什么当我从函数内部调用memset时不起作用。当然,我可以使用for循环来重置所有值,但是我在这里学习,这件事使我没有任何解释。
/* First source code */
#include <stdio.h>
#include <string.h>
int main(void) {
int i, j, num;
printf("Digit a number :");
scanf("%d", &num);
int magic[num][num];
printf("First\n");
for(i = 0; i < num; ++i) {
for(j = 0; j < num; ++j) {
printf("%4d", magic[i][j]);
}
printf("\n\n");
}
memset(magic, 0, sizeof(magic));
printf("Before\n");
for(i = 0; i < num; ++i) {
for(j = 0; j < num; ++j) {
printf("%4d", magic[i][j]);
}
printf("\n\n");
}
return 0;
}
Run Code Online (Sandbox Code Playgroud)
/* Second source code */ …Run Code Online (Sandbox Code Playgroud) 我正在研究 .EXE 程序和 .COM 程序之间的区别。.EXE 对我来说是合乎逻辑的,堆栈位于相对于程序代码的另一个段中(实际上堆栈是强制的并用 .STACK 指示此限制),因此,当我去插入值时??堆栈(在 .EXE 中),使用与程序不同的段,我不会混淆这两者。
例子:
SP = 0400
SS = 3996 CS = 3995 IP = 0000
Run Code Online (Sandbox Code Playgroud)
栈的容量为1024 Byte(400h),指的是栈段3996h,不同于代码段3995h。所以我确信数据不会混淆。
我不明白的是什么时候我必须处理 .COM 程序;因为我很清楚他们只使用一个段,我发现自己遇到了类似的情况:
SP = FFEE
SS = 114A CS = 114A IP = 0100
Run Code Online (Sandbox Code Playgroud)
我有与代码段匹配的堆栈段。因此,如果我继续将值放入堆栈中,它们迟早会出现在我的代码中吗?