程序收到信号 - gdb

时间:2016-10-13 00:22:25

标签: c gdb

对于以下question

Exercise 12335 - Write a C program to read through an array of any type. Write a C program to scan through this array to find a particular value.

这是我的解决方案:

#include<stdio.h>
enum types
  {
    integer,
    character,
    floatValue
  };
void f(void *, enum types);
void doSomething(void *, enum types);
int main(){
  int a[] ={1,2,3};
  enum types type = integer;
  f(a, type);
}

void f(void *ptr, enum types type){
  switch(type){
    case(integer):
      if(sizeof((int *)ptr)/sizeof(int) > 1){
        doSomething(&((int *)ptr)[1], type); // Print second element
      }
      break;
    case(character):
      if(sizeof((char *)ptr)/sizeof(char) > 1){
        doSomething(&((int *)ptr)[1], type); // Print second element
      }
      break;
    case(floatValue):
      if(sizeof((float *)ptr)/sizeof(float) > 1){
        doSomething(&((int *)ptr)[1], type); // Print second element
      }
      break;
  }
}

void doSomething(void *ptr, enum types type){
  switch(type){
    case(integer):
      printf("%d", *(int *)ptr);
      break;
    case(character):
      printf("%c", *(char *)ptr);
      break;
    case(floatValue):
      printf("%f", *(float *)ptr);
      break;
  }
}
> gcc -g temp.c -o program.exe
> gdb program.exe

以下是gdb输出:

enter image description here

enter image description here

问题:

为什么program.exe不起作用?

1 个答案:

答案 0 :(得分:1)

您无法仅根据指针找到数组的大小(指针只是一个地址 - 它不包含任何有关它所指向的信息)。

下面是修改函数的解决方案,并将数组大小作为参数传入。

#include<stdio.h>
enum types
  {
    integer,
    character,
    floatValue
  };
void f(void *, enum types, int a_size);
void doSomething(void *, enum types);
int main(){
  int a[] ={1,2,3};
  enum types type = integer;
  f(a, type, sizeof(a));
}

void f(void *ptr, enum types type, int a_size){
  switch(type){
    case(integer):
      if(a_size/sizeof(int) > 1){
        doSomething(&((int *)ptr)[1], type); // Print second element
      }
      break;
    case(character):
      if(a_size/sizeof(char) > 1){
        doSomething(&((int *)ptr)[1], type); // Print second element
      }
      break;
    case(floatValue):
      if(a_size/sizeof(float) > 1){
        doSomething(&((int *)ptr)[1], type); // Print second element
      }
      break;
  }
}

void doSomething(void *ptr, enum types type){
  switch(type){
    case(integer):
      printf("%d", *(int *)ptr);
      break;
    case(character):
      printf("%c", *(char *)ptr);
      break;
    case(floatValue):
      printf("%f", *(float *)ptr);
      break;
  }
}

我不确定它是否能解决您的gdb问题(我在Linux上,而不是Windows,并且没有收到任何信号),但该程序将正常运行。

[UPDATE]

这是一种风格的东西,但我会将f函数更新为:

void f(void *ptr, enum types type, int a_size){
  int unit_size;
  switch(type){
    case(integer):
      unit_size = sizeof(int);
      break;
    case(character):
      unit_size = sizeof(char);
      break;
    case(floatValue):
      unit_size = sizeof(float);
      break;
    default:
      break;
  }
  if((a_size/unit_size) > 1){
    doSomething(&((int *)ptr)[1], type); // Print second element
  }
}

它使其更易读,更快地添加不同类型,如果您将呼叫更改为doSomething,则只需在一个地方修改它。