【问题标题】:Can I modify a pointer value, from a function, if i receive the pointer address, with a pointer to pointer?如果我收到指针地址和指向指针的指针,我可以从函数修改指针值吗?
【发布时间】:2015-09-10 00:23:20
【问题描述】:

这里基本上是代码:

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++;
      }
    }
  }
}

所以当然,结果是“Segmentation Fault”。 我认为我没有正确使用指向指针符号的指针,或者从函数内部从指向指针的指针修改指针可能不是“合法的”。所以我很迷茫。

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

【问题讨论】:

  • 请修正你的变量名,你用英语声明它们并用西班牙语使用它们
  • 您的示例没有显示 resultado 的声明或初始化位置/方式,但看起来您已经为其赋予了全局范围(有助于更好地理解示例以查看它)。尽管如此,您似乎都在直接对 resultado 进行操作,同时使用指向您已通过调用的指针。这不是一件好事,因为它使代码难以遵循,并且任何缺陷都难以发现。
  • 不要在 C 中转换 malloc

标签: c pointers segmentation-fault


【解决方案1】:

其他地方可能存在段错误:

      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 循环,但会以一种在您得到之前几乎不会注意到的方式弄乱您的代码错误的返回值)特别是因为您似乎根本没有初始化这些数组。

【讨论】:

    【解决方案2】:

    一个问题:*(*(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);
    

    并在您的result 块中设置ith 字符,如下所示:

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

    【讨论】:

      猜你喜欢
      • 2016-08-11
      • 1970-01-01
      • 2011-04-26
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多