如果我收到指针地址,我可以修改一个函数的指针值,指针指针吗?

时间:2015-06-24 00:35:14

标签: c pointers segmentation-fault

这基本上是代码:

void calculate(int, int, char *, char *, char **); //the prototype of the function
int main(){

  int option;
  int operation_int=0;
  char operation[14];
  char value1[20];
  char value2[20];
  char *result;

  result = (char *)malloc(20*sizeof(char));
  calculate(2, operation_int, value1, value2, &result);

  return 0;
}
void calculate(int option, int operation_integ, char *var1, char *var2, char **res){
  int i=0;
  int value1 = 0;
  int value2 = 0;
  int calc_result = 0;


  switch(operation_integ){

    case 1:

    switch(option){

      case 1:
       break;

      case 2:
      while( ( (var1[i] != '\0') || (var2[i] != '\0') ) ){
        if( (var1[i] != '\0') ){ calc_result= calc_result + ( var1[i] - '0' ) * pow(10,i);}
        if( (var2[i] != '\0') ){ calc_result= calc_result+ ( var2[i] - '0' ) * pow(10,i);}
        i++;
      }

      i=0;

      while(calc_result!= 0){ //HERE IS SOMETHING WRONG
        *(*(res+i)) = (char)calc_result % 10;
        calc_result = calc_result/10;
        i++;
      }
    }
  }
}

当然,结果是“分段错误”。 我想我没有正确使用指针表示法的指针,或者从指针到指针,从函数内部修改指针可能不合法。所以我很失落。

。有人可以给我一些帮助吗?

2 个答案:

答案 0 :(得分:0)

其他地方可能存在seg故障:

      while( ( (var1[i] != '\0') || (var2[i] != '\0') ) ){

如果你的varN数组是这样的,例如:

var1 = {'2', '1', '\0', '3' .... (other non '\0' chars)};
var2 = {'3', '2', '5', '\0' .... (other non '\0' chars)};

你的while循环会继续并最终可能会产生一个段错误(如果你运气不好,你的其他变量可以设置为0,结束你的while循环但是弄乱了你的代码,直到你得到你很难注意到错误的返回值)特别是因为你似乎根本没有初始化那些数组。

答案 1 :(得分:0)

一个问题:*(*(res+i))

malloc返回指向连续内存块的指针。您将该指针的地址 calculate()发送为&result,然后将i添加到该地址。当您使用第一个(内部)*取消引用此新地址时,您将获得任何i > 0的随机内存的内容。如果此随机存储器的内容不是有效的内存地址,当您尝试使用第二个(最外面的)*取消引用时,您将会出现段错误。

我猜你想增加malloc返回的指针,以便访问它保留的内存块中的位置。

您可以尝试声明这样的功能:

void calculate(int, int, char *, char *, char *);

分配内存并像这样调用它:

result = malloc( 20 * sizeof(char) );
calculate(2, operation_int, value1, value2, result);

并在i块中设置result字符,如下所示:

*( res + i*sizeof(char) ) = (char)calc_result % 10