【问题标题】:Segmentation fault passing an address specifically defined as a string传递特别定义为字符串的地址的分段错误
【发布时间】:2015-11-26 03:16:51
【问题描述】:

这里有更多代码,因为我现在修复了我的主要程序有问题。

我有一个修改一系列字节的函数。在这个例子中,函数应该用数字 1 到 9 连续填充 char 数组的前 9 个字节。

运行两个测试。第一个是调用参数为(char*)&myvar的函数。第二个测试只使用myvar作为参数。我想当我希望在函数的参数部分返回字符串时,我总是必须在 char 数组指针前面使用 &。

为什么这个程序只有在我不将(char*)& 附加到我的 char 数组变量时才能工作?

当我应用它时,我收到了分段错误。

#include "stdio.h"
#include "stdlib.h"
#include "string.h"

int func(char* abc){
    char *p=abc;
    int n;
    for (n=1;n<10;n++){
    *p=(unsigned char)(n+48);p++;
    }
    return 0;
}

int main(){
    char vars[1000]="234";
    char *myvar=vars;

    printf("Function test\n");
    int result=func((char*)&myvar); //causes segfault
    printf("Function result %s\n",myvar); //segfault here

    printf("Function test again\n");
    int result2=func(myvar);        //works
    printf("Function result %s\n",myvar);

    printf("DONE\n");
    return 0;
}

【问题讨论】:

  • 尝试删除演员表(char *)
  • 移除强制转换除了导致编译器警告之外什么都不做。它并没有以任何方式解决问题。
  • 拆开你的代码,找出段错误的确切来源。
  • @AlanAu 这些警告正是为什么您需要移除演员表。告诉编译器保持安静并不能解决它抱怨的问题。警告使段错误的原因显而易见。
  • @mlp 当然应该删除演员表。那不是重点。只是说“删除演员表”并不能真正帮助显然需要解释指针的 OP。这就是为什么下面提供的答案很好的原因,因为它解释了需要做什么以及为什么需要这样做。

标签: c arrays segmentation-fault pass-by-reference memory-address


【解决方案1】:

为什么这个程序只有在我没有将(char*)&amp; 附加到我的 char 数组变量时才能工作?

因为这样做是完全错误的,而且没有意义。

当我想在函数的参数部分返回字符串时,我认为我总是必须在 char 数组指针前面使用 &。

你没有。 (另外,你没有“char数组指针”,“当我想要函数的参数部分返回的字符串时”没有意义。)

当您需要将char * 传递给采用char * 的函数时,您不需要在指针前面放置任何特殊前缀。你只是直接传递它,就像你做的那样

int result2=func(myvar);

您也可以传入vars,因为从数组自动转换为指向其第一个元素的指针,就像您可以在没有任何特殊转换的情况下执行char *myvar=vars;一样。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2021-12-30
    • 1970-01-01
    • 2019-12-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多