先发出来代码,大家可以跑跑看。
tp.h 文件:
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
typedef unsigned int Byte;
typedef struct {
int sign; /* 0 for pos and 1 for neg */
int size;
Byte *tab;
} bignum;
#define BASE 10
#define MAX(a, b) (((a) > (b)) ? (a) : (b))
#define MIN(a, b) (((a) < (b)) ? (a) : (b))
void init(char *s, bignum *n) {
int pos = 0;
if (s[0] == '-') {
n->sign = 1;
n->size = strlen(s) - 1;
// n->tab = calloc(n->size, sizeof(unsigned char));
n->tab = (Byte *)malloc(n->size * sizeof(unsigned char));
for (int i = n->size; i > 0; i--) {
n->tab[pos] = s[i];
pos++;
}
} else {
n->sign = 0;
n->size = strlen(s);
// n->tab = calloc(n->size, sizeof(unsigned char));
n->tab = (Byte *)malloc(n->size * sizeof(unsigned char));
for (int i = n->size - 1; i >= 0; i--) {
n->tab[pos] = s[i];
pos++;
}
}
// free(n->tab);
}
void showBigNum(bignum n) {
if (n.sign == 1) {
printf("-");
}
for (int i = n.size - 1; i >= 0; i--) {
printf("%d", n.tab[i] - '0');
}
}
tp.c 文件:
```C
#include "tp2.h"
int main(int argc, char *argv[]) {
if (argc != 3) {
printf("Please type 2 numbers as input\n");
exit(1);
}
bignum a, b;
init(argv[1], &a);
/* You can try to comment the line below and start again, then you can see the difference */
init(argv[2], &b);
showBigNum(a);
return 0;
}
可以试试:
**注释掉** 和 **不注释掉** *init(argv[2], &b);* 分别输出什么。
gcc tp.c ; ./a.out 255555 122577
理论上都应该输出 255555.
求大佬帮助修改,并指出原因。
鱼和渔都想要,不要熊掌……
1
111qqz 2019-03-14 00:24:11 +08:00 via Android
手机客户端排版是乱的。。。
|
3
CEBBCAT 2019-03-14 00:35:02 +08:00 via Android
|
4
CEBBCAT 2019-03-14 00:41:04 +08:00 via Android
另外呀,你那个 main 的文件里 include 错了吧?应该是 tp.h 才对
https://gist.github.com/Zhang-Siyang/dbfa69ecbd99c9652b9dfae118910f06 https://gist.github.com/Zhang-Siyang/a9cd1fd4a07f2d000ae16990d3571361 |
5
oIMOo OP @CEBBCAT
我发上来的是一个副本,所以删掉了一部分,谢谢提醒。 不过这部分就是问题根源…… 我用的默认配置。 我也试了 memset,可能方法不对…… 也试了在 init 最后 free (肯定不对,毕竟这个值我还要用),果然 free 完 a 和 b 相等了…… |
6
geelaw 2019-03-14 00:53:41 +08:00 via iPhone
你为什么不能直接告诉我们输出了什么?你是在考试还是提问?
无论如何,错误在于你访问越界,malloc 分配的是长度为 size 的 unsigned char 数组,但你把它当成长度为 size 的 int 数组使用。 |
8
GeruzoniAnsasu 2019-03-14 00:55:57 +08:00
描述只需看一句话都能肯定绝对是哪里越界了
至于到底哪越界了可就懒得仔细查了,人肉编译器(前端)还不如你加个-fsanitize=address 或者 valgrind 跑一下 |
9
across 2019-03-14 00:59:08 +08:00
没跑。
不过看到 (Byte *)malloc(n->size * sizeof(unsigned char)); 返回的是 int*指针,有对齐问题吧。n->size 不一定是 Byte*的倍数 |
10
CEBBCAT 2019-03-14 01:10:29 +08:00 via Android
看半天,我就一个问题:int 的类型为啥 malloc 的时候 sizeof 写的是无符号的 char ?
而且 malloc 拿到的内存没有初始化吧? |
11
CEBBCAT 2019-03-14 01:12:35 +08:00 via Android
大佬就是大佬啊,我看了好几遍才发现 malloc 那里 sizeof 用的是 unsigned char 而不是 unsigned int
|
12
oIMOo OP @geelaw 见谅哈
@geelaw @GeruzoniAnsasu @across 按照各位的提示,将 (Byte *)malloc(n->size * sizeof(unsigned char)); 变位 (Byte *)malloc(n->size * sizeof(unsigned int)); 谢谢各位点拔! |
14
GeruzoniAnsasu 2019-03-14 01:15:15 +08:00
绝了 一般人会把 byte typedef 成 int 的吗,根本没注意到
|
15
CEBBCAT 2019-03-14 01:19:15 +08:00 via Android
@oIMOo #12 恭喜你解决了这个问题,不过该用 sizeof(Byte)嘛,这样好维护(应该?)
|
16
oIMOo OP @geelaw @GeruzoniAnsasu @across @CEBBCAT @GeruzoniAnsasu
回答一下关于类型的问题: 因为 Byte 类型是要求,所以我先用 BASE 10 完成思路(现在正在做的)。 然后会转到 byte 上。 |