- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
我的代码有问题。我尝试实现大整数(比正常大),一切顺利。
我选择将它们表示为动态数组。因此,该函数接收一个 Shorts 指针(以使用更少的内存;我可以使用使用 1 个字节的 char,但 Short 也可以)并将其设置为动态数组。
在我的主函数中,我有一个(短指针)数组,其中包含各种数字(数组)的地址。问题是当我尝试比较当前指针上的数字和数组上的另一个数字时。每当我尝试将该地址分配给指针进行比较时,我都会收到编译器的警告:
cast to pointer from integer of different size [-Wint-to-pointer-cast]
我试图分配地址的指针也是一个简称指针。尝试:
short *p = arr[0];
short *p = (void *) arr[0];
short *p = (short *) arr[0];
@编辑
数组定义为short *arr[SIZE];
因为这是一个警告,所以程序已编译,但当尝试运行它时,我收到一个 Segmentation failure(core dumped)
错误,正如预期的那样。
最好的解决方案是什么?
@编辑2:
这是代码:
#include <stdio.h>
#include <stdlib.h>
#include "bigint.h"
#define SIZE 10000
int isInArr(short *p, short **arr, int length){
int i;
for(i = 0; i < length; i++){
if(equalBig(arr[i], p)){
return 1;
}
}
return 0;
}
void freeMem(short **arr, int length){
int i;
for(i = 0; i < length; i++){
free(arr[i]);
}
}
int main(){
short *p, *numbers[SIZE] = { NULL };
int a, b, count = 0;
p = malloc(sizeof(short)*BIG_INT);
for(a = 2; a <= 100; a++){
for(b = 2; b <= 100; b++){
powerBig(p, a, b);
if(!isInArr(p, numbers, count)){
numbers[count] = p;
createBig(&p);
count++;
}else{
clearBig(p);
}
}
}
printf("%d\n", count);
freeMem(numbers, count);
return 0;
}
bigint.c:
#include <stdio.h>
#include <stdlib.h>
#include "bigint.h"
/* Type Big Integer */
void createBig(short **pointer){ /* Constructor */
*pointer = malloc(sizeof(short)*BIG_INT);
clearBig(*pointer);
**pointer = STOP;
}
void clearBig(short *pointer){ /* Put 0's on ALL places of the array */
int i;
for(i = 0; i < BIG_INT; i++){
*(pointer+i) = 0;
}
}
void powerBig(short *p, int a, int b){ /* Operation - power */
int i = 0, j, digit = 0, rem;
short *tmp = malloc(sizeof(short)*BIG_INT); /* Variable for temporary allocation of array during product */
short base[4]; /* Variable for base */
short *q = base;
while(a != 0){ /* Put a in an array */
*(p + i) = a % 10;
*(q + i) = a % 10;
a = a / 10;
i++;
}
*(p + i) = STOP;
*(q + i) = STOP;
for(i = 1; i < b; i++){
digit = 0;
clearBig(tmp);
while(*(q + digit) != STOP){
rem = 0;
j = 0;
while(*(p + j) != STOP){
rem += (*(p + j)) * (*(q + digit));
rem += *(tmp + j + digit);
*(tmp + j + digit) = rem % 10;
rem /= 10;
j++;
}
if(rem != 0){
*(tmp + j + digit) = rem % 10;
j++;
}
*(tmp + j + digit) = STOP;
digit++;
}
copyBig(tmp, p); /* Update the p array */
}
free(tmp);
}
void copyBig(short *orig, short *dest){ /* Move big integer to another array */
int i;
for(i = 0; *(orig+i) != STOP; i++){
*(dest+i) = *(orig+i);
}
*(dest+i) = STOP;
}
int equalBig(short *p, short *q){
int i = 0;
if(p == NULL || q == NULL){
return 0;
}
while(*(q + i) != STOP && *(p + i) != STOP){
if(*(p + i) != *(q + i)){
return 0;
}
i++;
}
return (*(q + i) == *(p + i)) ? 1 : 0;
}
Valgrind 输出:
--20748-- REDIR: 0x401cfd0 (ld-linux-x86-64.so.2:strlen) redirected to 0x3809e181 (???)
--20748-- Reading syms from /usr/lib/valgrind/vgpreload_core-amd64-linux.so
--20748-- Considering /usr/lib/valgrind/vgpreload_core-amd64-linux.so ..
--20748-- .. CRC mismatch (computed 2567ccf6 wanted 49420590)
--20748-- object doesn't have a symbol table
--20748-- Reading syms from /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so
--20748-- Considering /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so ..
--20748-- .. CRC mismatch (computed 0e27c9a8 wanted ac585421)
--20748-- object doesn't have a symbol table
==20748== WARNING: new redirection conflicts with existing -- ignoring it
--20748-- old: 0x0401cfd0 (strlen ) R-> (0000.0) 0x3809e181 ???
--20748-- new: 0x0401cfd0 (strlen ) R-> (2007.0) 0x04c31020 strlen
--20748-- REDIR: 0x401b920 (ld-linux-x86-64.so.2:index) redirected to 0x4c30bc0 (index)
--20748-- REDIR: 0x401bb40 (ld-linux-x86-64.so.2:strcmp) redirected to 0x4c320d0 (strcmp)
--20748-- REDIR: 0x401dd30 (ld-linux-x86-64.so.2:mempcpy) redirected to 0x4c35270 (mempcpy)
--20748-- Reading syms from /lib/x86_64-linux-gnu/libc-2.23.so
--20748-- Considering /lib/x86_64-linux-gnu/libc-2.23.so ..
--20748-- .. CRC mismatch (computed 7a8ee3e4 wanted a5190ac4)
--20748-- Considering /usr/lib/debug/lib/x86_64-linux-gnu/libc-2.23.so ..
--20748-- .. CRC is valid
--20748-- REDIR: 0x4ec9a00 (libc.so.6:strcasecmp) redirected to 0x4a286f0 (_vgnU_ifunc_wrapper)
--20748-- REDIR: 0x4ec5280 (libc.so.6:strcspn) redirected to 0x4a286f0 (_vgnU_ifunc_wrapper)
--20748-- REDIR: 0x4ecbcf0 (libc.so.6:strncasecmp) redirected to 0x4a286f0 (_vgnU_ifunc_wrapper)
--20748-- REDIR: 0x4ec76f0 (libc.so.6:strpbrk) redirected to 0x4a286f0 (_vgnU_ifunc_wrapper)
--20748-- REDIR: 0x4ec7a80 (libc.so.6:strspn) redirected to 0x4a286f0 (_vgnU_ifunc_wrapper)
--20748-- REDIR: 0x4ec914b (libc.so.6:memcpy@GLIBC_2.2.5) redirected to 0x4a286f0 (_vgnU_ifunc_wrapper)
--20748-- REDIR: 0x4ec7400 (libc.so.6:rindex) redirected to 0x4c308a0 (rindex)
--20748-- REDIR: 0x4ec91b0 (libc.so.6:memset) redirected to 0x4a286f0 (_vgnU_ifunc_wrapper)
--20748-- REDIR: 0x4fac970 (libc.so.6:__memset_avx2) redirected to 0x4c344c0 (memset)
--20748-- REDIR: 0x4ebe130 (libc.so.6:malloc) redirected to 0x4c2db20 (malloc)
--20748-- REDIR: 0x4ebe4f0 (libc.so.6:free) redirected to 0x4c2ed80 (free)
==20748== Invalid write of size 2
==20748== at 0x400B54: powerBig (bigint.c:60)
==20748== by 0x400794: main (20.c:35)
==20748== Address 0x5ae1032 is 0 bytes after a block of size 402 alloc'd
==20748== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20748== by 0x400913: powerBig (bigint.c:26)
==20748== by 0x400794: main (20.c:35)
==20748==
==20748== Invalid read of size 2
==20748== at 0x400C0F: copyBig (bigint.c:71)
==20748== by 0x400B8C: powerBig (bigint.c:64)
==20748== by 0x400794: main (20.c:35)
==20748== Address 0x5ae1032 is 0 bytes after a block of size 402 alloc'd
==20748== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20748== by 0x400913: powerBig (bigint.c:26)
==20748== by 0x400794: main (20.c:35)
==20748==
==20748== Invalid write of size 2
==20748== at 0x400C28: copyBig (bigint.c:74)
==20748== by 0x400B8C: powerBig (bigint.c:64)
==20748== by 0x400794: main (20.c:35)
==20748== Address 0x5ae0e52 is 0 bytes after a block of size 402 alloc'd
==20748== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20748== by 0x40087C: createBig (bigint.c:9)
==20748== by 0x4007DD: main (20.c:39)
==20748==
==20748== Invalid read of size 2
==20748== at 0x400AE2: powerBig (bigint.c:47)
==20748== by 0x400794: main (20.c:35)
==20748== Address 0x5ae1212 is 0 bytes after a block of size 402 alloc'd
==20748== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20748== by 0x40087C: createBig (bigint.c:9)
==20748== by 0x4007DD: main (20.c:39)
==20748==
==20748== Invalid read of size 2
==20748== at 0x400A6A: powerBig (bigint.c:49)
==20748== by 0x400794: main (20.c:35)
==20748== Address 0x5ae13f2 is 0 bytes after a block of size 402 alloc'd
==20748== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20748== by 0x400913: powerBig (bigint.c:26)
==20748== by 0x400794: main (20.c:35)
==20748==
==20748== Invalid write of size 2
==20748== at 0x400AB0: powerBig (bigint.c:50)
==20748== by 0x400794: main (20.c:35)
==20748== Address 0x5ae13f2 is 0 bytes after a block of size 402 alloc'd
==20748== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20748== by 0x400913: powerBig (bigint.c:26)
==20748== by 0x400794: main (20.c:35)
==20748==
==20748== Invalid write of size 2
==20748== at 0x400B34: powerBig (bigint.c:56)
==20748== by 0x400794: main (20.c:35)
==20748== Address 0x5ae13f4 is 2 bytes after a block of size 402 alloc'd
==20748== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20748== by 0x400913: powerBig (bigint.c:26)
==20748== by 0x400794: main (20.c:35)
==20748==
==20748== Invalid read of size 2
==20748== at 0x400BF5: copyBig (bigint.c:72)
==20748== by 0x400B8C: powerBig (bigint.c:64)
==20748== by 0x400794: main (20.c:35)
==20748== Address 0x5ae13f2 is 0 bytes after a block of size 402 alloc'd
==20748== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20748== by 0x400913: powerBig (bigint.c:26)
==20748== by 0x400794: main (20.c:35)
==20748==
==20748== Invalid write of size 2
==20748== at 0x400BF8: copyBig (bigint.c:72)
==20748== by 0x400B8C: powerBig (bigint.c:64)
==20748== by 0x400794: main (20.c:35)
==20748== Address 0x5ae1212 is 0 bytes after a block of size 402 alloc'd
==20748== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20748== by 0x40087C: createBig (bigint.c:9)
==20748== by 0x4007DD: main (20.c:39)
==20748==
==20748== Invalid read of size 2
==20748== at 0x400A31: powerBig (bigint.c:48)
==20748== by 0x400794: main (20.c:35)
==20748== Address 0x5ae15d2 is 0 bytes after a block of size 402 alloc'd
==20748== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20748== by 0x40087C: createBig (bigint.c:9)
==20748== by 0x4007DD: main (20.c:39)
==20748==
--20748-- VALGRIND INTERNAL ERROR: Valgrind received a signal 11 (SIGSEGV) - exiting
--20748-- si_code=1; Faulting address: 0x6112E58; sp: 0x808ca9e30
valgrind: the 'impossible' happened:
Killed by fatal signal
host stacktrace:
==20748== at 0x38091C12: ??? (in /usr/lib/valgrind/memcheck-amd64-linux)
==20748== by 0x38050E84: ??? (in /usr/lib/valgrind/memcheck-amd64-linux)
==20748== by 0x38051056: ??? (in /usr/lib/valgrind/memcheck-amd64-linux)
==20748== by 0x380D4F7B: ??? (in /usr/lib/valgrind/memcheck-amd64-linux)
==20748== by 0x380E3946: ??? (in /usr/lib/valgrind/memcheck-amd64-linux)
sched status:
running_tid=1
Thread 1: status = VgTs_Runnable (lwpid 20748)
==20748== at 0x4C2DB8F: malloc (in /usr/lib/valgrind/vgpreload_memcheck-amd64-linux.so)
==20748== by 0x40087C: createBig (bigint.c:9)
==20748== by 0x4007DD: main (20.c:39)
最佳答案
如果我理解正确的话,isInArr
会检查p
的内容是否已经在numbers
中。那么你就有了传递一个指向 numbers
的指针,为此您必须更改 isInArr
函数至:
int isInArr(short *p, short **arr, int length){
int i;
if(length >= SIZE)
length = SIZE; // checking that you don't access `arr` out of bounds
for(i = 0; i < length; i++){
if(equalBig(arr[i], p)){
return 1;
}
}
return 0;
}
并在main
中调用它:
if(!isInArr(p, numbers, count)){
因为您想要搜索整个 numbers
数组。我也愿意像这样声明数字
:
short *numbers[SIZE] = { NULL };
这样所有的指针都被初始化为NULL
,在equalBig
中你可以添加一个额外检查 if(p == NULL || q == NULL) return 0;
以防止 NULL
指针。
编辑
OP wrote in comments
the output is:
20.c: In function ‘isInArr’: 20.c:11:15: warning: passing argument 1 of ‘equalBig’ makes pointer from integer without a cast [-Wint-conversion] if(equalBig(arr[i], p)){ ^ In file included from 20.c:3:0: bigint.h:8:5: note: expected ‘short int ’ but argument is of type ‘short int’ int equalBig(short *p, short *q); / Compare */ ^
我猜你在代码中的某个地方仍然有一个小错误,一些变量仍然有错误的类型。
我可以毫无问题地编译并运行此代码(其中有我的修复程序):
#include <stdio.h>
#include <stdlib.h>
#define SIZE 10
#define STOP 99
int equalBig(short *p, short *q){
int i = 0;
while(*(q + i) != STOP && *(p + i) != STOP){
if(*(p + i) != *(q + i)){
return 0;
}
i++;
}
return (*(q + i) == *(p + i)) ? 1 : 0;
}
int isInArr(short *p, short **arr, int length){
int i;
if(length >= SIZE)
length = SIZE; // checking that you don't access `arr` out of bounds
for(i = 0; i < length; i++){
if(equalBig(arr[i], p)){
return 1;
}
}
return 0;
}
int main(void)
{
short *p, *numbers[SIZE] = { NULL };
numbers[0] = calloc(10, sizeof *numbers[0]);
numbers[1] = calloc(10, sizeof *numbers[1]);
p = calloc(10, sizeof *p);
numbers[0][3] = STOP;
numbers[1][4] = STOP;
p[4] = STOP;
printf("isInArr: %d\n", isInArr(p, numbers, 2));
free(numbers[0]);
free(numbers[1]);
free(p);
return 0;
}
$ gcc a.c -oa -g -Wall
$ valgrind ./a
==10955== Memcheck, a memory error detector
==10955== Copyright (C) 2002-2017, and GNU GPL'd, by Julian Seward et al.
==10955== Using Valgrind-3.13.0 and LibVEX; rerun with -h for copyright info
==10955== Command: ./a
==10955==
isInArr: 1
==10955==
==10955== HEAP SUMMARY:
==10955== in use at exit: 0 bytes in 0 blocks
==10955== total heap usage: 4 allocs, 4 frees, 1,084 bytes allocated
==10955==
==10955== All heap blocks were freed -- no leaks are possible
==10955==
==10955== For counts of detected and suppressed errors, rerun with: -v
==10955== ERROR SUMMARY: 0 errors from 0 contexts (suppressed: 0 from 0)
关于c - 带地址的数组,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49184947/
#include using namespace std; class C{ private: int value; public: C(){ value = 0;
这个问题已经有答案了: What is the difference between char a[] = ?string?; and char *p = ?string?;? (8 个回答) 已关闭
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 7 年前。 此帖子已于 8 个月
除了调试之外,是否有任何针对 c、c++ 或 c# 的测试工具,其工作原理类似于将独立函数复制粘贴到某个文本框,然后在其他文本框中输入参数? 最佳答案 也许您会考虑单元测试。我推荐你谷歌测试和谷歌模拟
我想在第二台显示器中移动一个窗口 (HWND)。问题是我尝试了很多方法,例如将分辨率加倍或输入负值,但它永远无法将窗口放在我的第二台显示器上。 关于如何在 C/C++/c# 中执行此操作的任何线索 最
我正在寻找 C/C++/C## 中不同类型 DES 的现有实现。我的运行平台是Windows XP/Vista/7。 我正在尝试编写一个 C# 程序,它将使用 DES 算法进行加密和解密。我需要一些实
很难说出这里要问什么。这个问题模棱两可、含糊不清、不完整、过于宽泛或夸夸其谈,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开,visit the help center . 关闭 1
有没有办法强制将另一个 窗口置于顶部? 不是应用程序的窗口,而是另一个已经在系统上运行的窗口。 (Windows, C/C++/C#) 最佳答案 SetWindowPos(that_window_ha
假设您可以在 C/C++ 或 Csharp 之间做出选择,并且您打算在 Windows 和 Linux 服务器上运行同一服务器的多个实例,那么构建套接字服务器应用程序的最明智选择是什么? 最佳答案 如
你们能告诉我它们之间的区别吗? 顺便问一下,有什么叫C++库或C库的吗? 最佳答案 C++ 标准库 和 C 标准库 是 C++ 和 C 标准定义的库,提供给 C++ 和 C 程序使用。那是那些词的共同
下面的测试代码,我将输出信息放在注释中。我使用的是 gcc 4.8.5 和 Centos 7.2。 #include #include class C { public:
很难说出这里问的是什么。这个问题是含糊的、模糊的、不完整的、过于宽泛的或修辞性的,无法以目前的形式得到合理的回答。如需帮助澄清此问题以便重新打开它,visit the help center 。 已关
我的客户将使用名为 annoucement 的结构/类与客户通信。我想我会用 C++ 编写服务器。会有很多不同的类继承annoucement。我的问题是通过网络将这些类发送给客户端 我想也许我应该使用
我在 C# 中有以下函数: public Matrix ConcatDescriptors(IList> descriptors) { int cols = descriptors[0].Co
我有一个项目要编写一个函数来对某些数据执行某些操作。我可以用 C/C++ 编写代码,但我不想与雇主共享该函数的代码。相反,我只想让他有权在他自己的代码中调用该函数。是否可以?我想到了这两种方法 - 在
我使用的是编写糟糕的第 3 方 (C/C++) Api。我从托管代码(C++/CLI)中使用它。有时会出现“访问冲突错误”。这使整个应用程序崩溃。我知道我无法处理这些错误[如果指针访问非法内存位置等,
关闭。这个问题不符合Stack Overflow guidelines .它目前不接受答案。 我们不允许提问寻求书籍、工具、软件库等的推荐。您可以编辑问题,以便用事实和引用来回答。 关闭 7 年前。
已关闭。此问题不符合Stack Overflow guidelines 。目前不接受答案。 要求我们推荐或查找工具、库或最喜欢的场外资源的问题对于 Stack Overflow 来说是偏离主题的,因为
我有一些 C 代码,将使用 P/Invoke 从 C# 调用。我正在尝试为这个 C 函数定义一个 C# 等效项。 SomeData* DoSomething(); struct SomeData {
这个问题已经有答案了: Why are these constructs using pre and post-increment undefined behavior? (14 个回答) 已关闭 6
我是一名优秀的程序员,十分优秀!