小编Rob*_*cco的帖子

为什么 mktime 给我的时间少了一个小时?

我想看看 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 进行测试。我尝试在另一个架构下使用另一个编译器,它给了我正确的值。

c mktime

5
推荐指数
1
解决办法
708
查看次数

为什么memset在功能上会有所不同?

我试图弄清楚为什么当我从函数内部调用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)

c arrays function c99 memset

2
推荐指数
1
解决办法
61
查看次数

为什么.COM 程序中只有一个段,既用于程序代码又用于堆栈?

我正在研究 .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)

我有与代码段匹配的堆栈段。因此,如果我继续将值放入堆栈中,它们迟早会出现在我的代码中吗?

assembly dos memory-segmentation x86-16

2
推荐指数
1
解决办法
109
查看次数

标签 统计

c ×2

arrays ×1

assembly ×1

c99 ×1

dos ×1

function ×1

memory-segmentation ×1

memset ×1

mktime ×1

x86-16 ×1