gpt4 book ai didi

c - 带地址的数组

转载 作者:行者123 更新时间:2023-11-30 19:31:14 25 4
gpt4 key购买 nike

我的代码有问题。我尝试实现大整数(比正常大),一切顺利。

我选择将它们表示为动态数组。因此,该函数接收一个 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/

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