将地址或指针传递给C函数

时间:2019-03-05 09:45:23

标签: c pointers segmentation-fault pass-by-reference

在下面的两段代码中,我不明白为什么后一段给出了分段错误。我显然错误地认为我在两种情况下都传递了一个地址...指针是正确的地址吗?

所以这个可行:

#include<iostream>
using namespace std;
int test(char *a) {
        *a = *a + 15;
        return 0;
}
int main() {
        char b;
        b = 'c';
        cout << b;
        test(&b);
        cout << b;
}

它输出:

r

但是这给分割带来了错误,为什么?:

...

int test(char *a) {
        *a = *a + 15;
        return 0;
}

int main() {
        char *b;
        *b = 'c';
        cout << b;
        test(b);
        cout << *b;
}

5 个答案:

答案 0 :(得分:1)

因为b的内存不在此处分配:

char *b;

示例作品:

char *b = (char*)malloc(sizeof(char));
*b = 'a';
char a = 'a';
char *b = &a;
//C++ only
char *b = new char[1];
*b = 'a';

答案 1 :(得分:0)

  

但是这给分割带来了错误,为什么?

b -它是指向内存中地址的指针。 在*b = 'c';行中,您为未初始化区域分配了一些值。 为避免这种情况,您应该理解在分配 in 指针值之前,应先初始化b。

    char *b;
    /*-------*/
    char bb;
    b = &bb;
    /*-------*/
    *b = 'c';
    cout << b;
    test(b);
    cout << *b;

答案 2 :(得分:0)

定义指针并不意味着已为程序分配了内存。

 char *b;
 *b = 'c';

这是未定义的行为,因为指针可以指向任何东西。

有两种方法可以解决此问题。

char *b;
char ch = 'c';
*b = &ch; // taking the address of ch

现在b指向静态分配的ch

有一种动态分配方法。

char *b = malloc(sizeof(char));
*b = 'c';
free(b);

答案 3 :(得分:0)

@Some程序员已经提到的问题:在第二个示例中,变量b是一个指针,它指向一个未定义的地址。但是,声明和初始化指针的最佳方法是这样的:

char *b = NULL;

在第一个示例中,变量b被保存/依赖于堆栈。您可以使用它。 在第二个示例中,如前所述,您只有一个指针。如果要在这种情况下使用指针,则有两个选择:

  1. 使用局部变量(堆栈变量)并将地址分配给指针,如下所示:

    char a = 'c';
    char *b = &a;
    
  2. 使用堆。因此,从堆中获取内存以使用您的字符指针。这意味着字符指针指向堆上的地址:

    char *b = malloc(sizeof(char) * 1); // allocate space on the heap
    b[0] = 'c' // or *b = 'c'
    ... // do some stuff and then
    free(b); // don't forget to free your allocated space
    

答案 4 :(得分:0)

在C和C ++中,声明指针并不意味着变量指向有效的内存地址。将指针视为地址卡,它的唯一目的是告诉您内存块(在堆中)的地址。

您有责任确保指针变量所指向的地址是有效的内存块。如何使内存块有效分配空间?好吧,您可以使用name="r_end"系列功能之一或malloc关键字(仅C ++)。

new

在您的代码中,没有为指针分配内存。它指向哪里?未初始化的指针变量指向的地址是否是有效的存储块?不。