gpt4 book ai didi

c - 在终端上运行 c 源代码会产生奇怪的输出

转载 作者:行者123 更新时间:2023-11-30 19:05:04 24 4
gpt4 key购买 nike

所以,我已经获得了远程服务器的权限,我通过 ssh 将文件复制到/opt 目录中。当我编译代码时,它没有给出错误,但是当我使用运行 a.out 时

./a.out

它输出一组奇怪的字符,如下所示:-

�gjx�}|_�]�������D���"�%

我使用时目录下有两个c源文件

$stty sane
$tput clear

一个文件成功运行,但另一个文件未成功。我也尝试过:

Ctrl+C
reset

它不起作用,如果您需要查看终端,我会提供它。我真的不明白我该怎么办。

我的代码:

#include <fcntl.h>
#include <stdint.h>
#include <stdio.h>
#include <stdlib.h>
#include <sys/mman.h>
#include <sys/stat.h>
#include <unistd.h>

static uint32_t map_size = 0x08000000;
static uint32_t map_base = 0x18000000;
static uint32_t map_addr = 0x00000000;

static char *dev_mem = "/dev/mem";

int main(int argc, char **argv) {
int fd;
uint32_t *buf;
if ((fd = open(dev_mem, O_RDWR | O_SYNC)) == -1) {
printf("can't open /dev/mem .\n");
exit(EXIT_FAILURE);
}

buf = mmap((uint32_t *) map_addr, map_size, PROT_READ | PROT_WRITE, MAP_SHARED, fd, map_base);
if (buf == (void *) -1) {
printf("Can't be mapped. \n");
exit(EXIT_FAILURE);
}
else
map_addr = (long unsigned) buf;

fwrite(buf, 1, map_size, stdout);

// Fletcher's 32 bit checksum algorithm
uint32_t sum1 = 0xffff, sum2 = 0xffff;
uint32_t tempLen;
while (map_size) {
tempLen = map_size >= 359 ? 359 : map_size;
map_size -= tempLen;
do {
sum2 += sum1 += *buf++;
} while (--tempLen);
sum1 = (sum2 & 0xffff) + (sum1 >> 16);
sum2 = (sum2 & 0xffff) + (sum2 >> 16);
}

sum1 = (sum1 & 0xffff) + (sum1 >> 16);
sum2 = (sum2 & 0xffff) + (sum2 >> 16);

uint32_t sum = sum2 << 16 | sum1;

printf("%u", sum);

close(fd);

return 0;
}

编辑注释掉fwrite(buf, 1, map_size, stdout);后终端没有打印奇怪的字符,但现在我假设它应该打印总和的值,即 uint32_t sum = sum2 << 16 | sum1;它没有这样做,而是现在当我运行 time ./a.out 时收到此消息

Segmentation fault (core dumped)

real 0m4.327s
user 0m4.270s
sys 0m0.010s

最佳答案

map_size 以字节为单位,但 uint32_t buf 表示 *buf++ 每次前进 4 个字节,直到出现缓冲区溢出并且代码段错误。

注意:您有各种类型和转换错误,导致代码无法移植。

关于c - 在终端上运行 c 源代码会产生奇怪的输出,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50695241/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com