将地址或指针传递给C函数[重复]

问题描述 投票:0回答:5

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

所以这个工作:

#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;
}
c pointers segmentation-fault pass-by-reference
5个回答
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';

0
投票

但这个给出了分段错误,为什么呢?

b - 它是指向内存中地址的指针。在*b = 'c';行中,您为初始化区域分配了一些值。要避免它,你应该明白,在指定任何值之前你应该初始化参考b。

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

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);

0
投票

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

char *b = NULL;

在第一个示例中,变量b被保存/位于堆栈中。你可以使用它。在第二个例子中,如上所述,你只有一个指针。如果要在此上下文中使用指针,则有两个选项:

  1. 使用本地(堆栈变量)并将地址分配给指针,如下所示: char a = 'c'; char *b = &a;
  2. 使用堆。所以从堆中获取内存以使用您的char指针。这意味着char指针指向堆上的地址: 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

0
投票

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

您有责任确保指针变量指向的地址是有效的内存块。如何使内存块成为有效的分配空间?好吧,你使用malloc系列函数之一或new关键字(仅限C ++)。

char *c; // Just an address somewhere
c = malloc(10); // Now, the address pointed by c is a 10 byte long memory block
.....
.....

free(c); // return the allocated memory to OS when you are done

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

© www.soinside.com 2019 - 2024. All rights reserved.