这个乘法还是堆栈设置中的指针是用 C 编写的

Is this multiplication or a pointer in stack setup written in C

我试图了解堆栈的实现方式,我遇到了这段代码

while(x-- >= 0){
        token_size = (strlen(argv[x])+1)*sizeof(char);
        *esp = *esp - token_size;
        arr[x] = (uint32_t *)*esp;
        memcpy(*esp, argv[x], strlen(argv[x])+1);
    }

首先,为什么我们在将参数压入堆栈时减少堆栈指针,我的印象是我们添加到堆栈的末尾并从堆栈的前面获取,所以我们肯定会增加堆栈指针以添加到堆栈的末尾吗?如果我错了请纠正我(几乎肯定是这样)。

回到标题的话题,在 while 循环的第一部分,字符串 argv[x] 的大小添加了 +1,我不确定为什么会这样,这是乘以字符串大小 sizeof(char) 或者这是一个指针?

任何解释(或多或少)都非常感谢,提前谢谢!

堆栈在实践中可能会增加或减少。有一些关于计算机体系结构的深厚历史导致堆栈向下增长 on a number of common computer systems,包括今天您可能每天都在使用的 x86 处理器。只要坚持使用堆栈,向下增长就不是功能问题(尽管它会带来一些复杂的安全问题)

关于表达式(strlen(argv[x])+1)*sizeof(char);

我们添加 +1 为空终止符腾出空间。在 C 中,字符串只是连续的非空字符,后跟一个标记结束的空字符。 strlen不计算长度的null(例如strlen("Hello")是5,而计算null时需要存储的内存是6个字符)。

* 是一个乘法 -- 它是一个 二元 运算符,在左侧和右侧都有一个操作数。星号用于在 一元 上下文中执行指针间接寻址(例如 *a = 5foo(*b, *c).