如何解决如何在C中访问const char *[]的数组元素
我有一个通过 const char* fix[] 的函数。我想知道如何访问 const char* fix[] 的元素。
int evaluate(const size_t size,const char* fix[],int *result)
当我尝试如下访问时,出现分段错误
push(stack,*fix[i]-'0');
我的推送功能如下
void push(Stack *stack,char no)
{
stack->stack_array[stack->top++] = no;
}
我的完整代码如下
#include <stdio.h>
#include <stdlib.h>
#include <ctype.h>
#define STACK_EMPTY -1
#define STACK_NOT_EMPTY 1
#define STATUS_INVALID -1
#define STATUS_SUCCESS 1
#define STATUS_DIVIDE_BY_ZERO 0
typedef struct
{
int top;
unsigned stack_size;
int *stack_array;
p
}Stack;
/*Stack Operations : Create,Push and Pop functions*/
Stack *Create_Stack(unsigned stack_size)
{
Stack *stack_mem = (Stack*)malloc(sizeof(stack_size));
/*Return NULL if the pinter is invalid*/
if(!stack_mem)
{
return NULL;
}
stack_mem->top = -1;
stack_mem->stack_size = stack_size;
stack_mem->stack_array = (int*)malloc(stack_mem->stack_size * sizeof(int));
if(!stack_mem->stack_array)
{
return NULL;
}
return stack_mem;
}
int isStackEmpty(Stack* stack)
{
if(stack->top == -1)
return STACK_EMPTY;
else {
return STACK_NOT_EMPTY;
}
}
void push(Stack *stack,char no)
{
stack->stack_array[stack->top++] = no;
}
char pop(Stack *stack)
{
if(!isStackEmpty(stack))
{
return stack->stack_array[stack->top--];
}
return '#';
}
char peek(Stack *stack)
{
return stack->stack_array[stack->top];
}
int evaluate(const size_t fix_size,int *result)
{
/*Create Stack*/
Stack *stack = Create_Stack(fix_size);
int i;
int valu1;
int valu2;
int return_result;
int return_status;
if (!stack)
return -1;
/*Scan the characters and store the numbers in stack*/
for(i = 0; i < fix_size;++i )
{
printf("%c",*fix[i]);
if(isdigit(fix[i]))
// printf(":SIze = %c",*fix[i]);
push(stack,*fix[i]-'0');
else {
if(fix_size>2)
{
valu1 = pop(stack);
valu2 = pop(stack);
switch(*fix[i])
{
case '+':*result = valu1+valu2;
return_status = STATUS_SUCCESS;
break;
case '-':*result = valu1-valu2;
return_status = STATUS_SUCCESS;
break;
case '*':*result = valu1*valu2;
return_status = STATUS_SUCCESS;
break;
case '/':
if(valu2 != 0)
{
*result = valu1/valu2;
}
else {
return_status = STATUS_DIVIDE_BY_ZERO;;
}
break;
}
}
else {
return STATUS_INVALID;
}
}
}
return return_status;
}
int main()
{
char exp[] = "231*+9-";
int *result;
evaluate(7,exp,&result);
return 0;
}
谁能告诉我如何访问 const char * 数组 []
提前致谢!
解决方法
编译器标志是你的朋友!编写代码时始终启用 -Wall -Wextra
(并启用 -Werror
以进行良好测量)。编译您的代码使它像圣诞树一样亮起警告和错误:
soSeg.c:17:3: error: expected specifier-qualifier-list before ‘p’
17 | p
| ^
不确定你是如何编译它的,你的结构定义中有一个悬空的“p”
soSeg.c: In function ‘evaluate’:
soSeg.c:84:16: warning: comparison of integer expressions of different signedness: ‘int’ and ‘size_’ {aka ‘const long unsigned int’} [-Wsign-compare]
84 | for(i = 0; i < fix_size;++i )
| ^
选择一个,要么使 i
size_t
要么 fix_size
int
soSeg.c: In function ‘main’:
soSeg.c:136:14: warning: passing argument 2 of ‘evaluate’ from incompatible pointer type [-Wincompatible-pointer-types]
136 | evaluate(7,exp,&result);
| ^~~
| |
| char *
soSeg.c:70:49: note: expected ‘const char **’ but argument is of type ‘char *’
70 | int evaluate(const size_t fix_size,const char* fix[],int *result)
| ~~~~~~~~~~~~^~~~~
soSeg.c:136:18: warning: passing argument 3 of ‘evaluate’ from incompatible pointer type [-Wincompatible-pointer-types]
136 | evaluate(7,&result);
| ^~~~~~~
| |
| int **
soSeg.c:70:62: note: expected ‘int *’ but argument is of type ‘int **’
70 | int evaluate(const size_t fix_size,int *result)
| ~~~~~~^~~~~~
但这是您的段错误的根源。你是:
- 在期望
char *
时仅将evaluate()
传递给char **
- 当
&result
已经是result
时,您也会出于任何原因传递int *
- 这一行
Stack *stack_mem = (Stack*)malloc(sizeof(stack_size));
没有做你认为它会做的事情。您正在分配 stack_size
字节。相反,你应该这样做
Stack *stack_mem = malloc(sizeof(Stack)*stack_size);
- 首先也没有理由将
char *[]
传递给您的函数。制作它
int evaluate(const size_t fix_size,const char fix[],int *result)
(并将您的所有 *fix[i]
更改为 fix[i]
)也同样有效。
所有这些都会导致大量的越界访问
==581== Memcheck,a memory error detector
==581== Copyright (C) 2002-2017,and GNU GPL'd,by Julian Seward et al.
==581== Using Valgrind-3.17.0.GIT and LibVEX; rerun with -h for copyright info
==581== Command: ./soSeg
==581==
==581==
==581== Invalid read of size 4
==581== at 0x1091EC: Create_Stack (in /petsc/soSeg)
==581== by 0x109316: evaluate (in /petsc/soSeg)
==581== by 0x1094F7: main (in /petsc/soSeg)
==581== Address 0x4a78044 is 0 bytes after a block of size 4 alloc'd
==581== at 0x484D93F: malloc (vg_replace_malloc.c:307)
==581== by 0x1091C1: Create_Stack (in /petsc/soSeg)
==581== by 0x109316: evaluate (in /petsc/soSeg)
==581== by 0x1094F7: main (in /petsc/soSeg)
==581==
==581== Invalid write of size 8
==581== at 0x109204: Create_Stack (in /petsc/soSeg)
==581== by 0x109316: evaluate (in /petsc/soSeg)
==581== by 0x1094F7: main (in /petsc/soSeg)
==581== Address 0x4a78048 is 4 bytes after a block of size 4 alloc'd
==581== at 0x484D93F: malloc (vg_replace_malloc.c:307)
==581== by 0x1091C1: Create_Stack (in /petsc/soSeg)
==581== by 0x109316: evaluate (in /petsc/soSeg)
==581== by 0x1094F7: main (in /petsc/soSeg)
==581==
==581==
==581== Invalid read of size 1
==581== at 0x10934F: evaluate (in /petsc/soSeg)
==581== by 0x1094F7: main (in /petsc/soSeg)
==581== Address 0x2d392b2a313332 is not stack'd,malloc'd or (recently) free'd
==581==
==581==
==581== Process terminating with default action of signal 11 (SIGSEGV)
==581== General Protection Fault
==581== at 0x10934F: evaluate (in /petsc/soSeg)
==581== by 0x1094F7: main (in /petsc/soSeg)
==581==
==581== HEAP SUMMARY:
==581== in use at exit: 32 bytes in 2 blocks
==581== total heap usage: 2 allocs,0 frees,32 bytes allocated
==581==
==581== LEAK SUMMARY:
==581== definitely lost: 28 bytes in 1 blocks
==581== indirectly lost: 0 bytes in 0 blocks
==581== possibly lost: 0 bytes in 0 blocks
==581== still reachable: 4 bytes in 1 blocks
==581== suppressed: 0 bytes in 0 blocks
==581== Rerun with --leak-check=full to see details of leaked memory
==581==
==581== For lists of detected and suppressed errors,rerun with: -s
==581== ERROR SUMMARY: 5 errors from 5 contexts (suppressed: 0 from 0)
Segmentation fault
注意我已经删减了上面的内容,因为您在循环中进行了这些越界访问
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。