C数组指针分段故障

时间:2016-08-23 09:24:08

标签: c arrays pointers

我对指针并不熟悉,我偶然发现我的代码出现了分段错误,如果我不使用指针,这段代码运行得很好。

#include <stdio.h>
#include <string.h>

int main()
{ 

    char *string[100],i,j;
    char *(*odd)[100];
    i = j = 0;

    fgets(*string, 100, stdin);

    while (*string[i] != '\0') {
        if (i % 2 == 0) {
                *odd[j++] = string[i];
        }
        i++;
    }

    *odd[j] = '\0';

    printf("Characters at odd position: %s\n",*odd[j]);

    return 0;
}

我猜测我以错误的方式打印odd数组,但我也无法使用*odd打印它。

4 个答案:

答案 0 :(得分:2)

char *string[100],i,j;
fgets(*string, 100, stdin);

您正在尝试写入string[0]的地址,但未初始化。我想你的意思就像是

char string[100];
fgets(string, 100, stdin);

P.S。 char *string[]是一个指向char的指针数组,而char string[]是一个字符数组,对于这种情况,表达式string衰减指向第一个元素,即指向char的指针。

答案 1 :(得分:2)

使用指针:

var Dispatcher = new Rx.Subject();
var source1 = Dispatcher.filter(x => x === 'foo');
var source2 = Dispatcher.filter(x => x === 'bar');
var source3 = Dispatcher.filter(x => x === 'baz');

var combined = source1.publish(function(s1) {
    return source2.publish(function(s2) {
        return source3.publish(function(s3) {
            var cL = s1.combineLatest(s2, s3).take(1).do(() => console.log('cL'));
            var wLF = s1.skip(1).withLatestFrom(s2, s3).do(() => console.log('wLF'));

            return Rx.Observable.merge(cL, wLF);
        });
    });
});

var sub1 = combined.subscribe(x => console.log('x', x));

// These can arrive in any order
// and we can get multiple values from any one.
Dispatcher.onNext('foo');
Dispatcher.onNext('bar');
Dispatcher.onNext('foo');
Dispatcher.onNext('baz');

// combineLatest triggers once we have all values.
// cL
// x ["foo", "bar", "baz"]

// withLatestFrom takes over from there.
Dispatcher.onNext('foo');
Dispatcher.onNext('bar');
Dispatcher.onNext('foo');
// wLF
// x ["foo", "bar", "baz"]
// wLF
// x ["foo", "bar", "baz"]

没有指针:

#include <stdio.h>
#include <string.h>
#include <stdlib.h>

#define SIZEOF_BUFFER 100

int main(){ 
    char *string; // string is a pointer
    char i,j;

    char *odd; // odd is a pointer

    // allocate memory to be able to store data
    string = malloc(sizeof(char) * SIZEOF_BUFFER);

    if (string == NULL) {
        exit(-1);
    }

    odd = malloc(sizeof(char) * SIZEOF_BUFFER);

    if (od == NULL) {
        free(string);
        exit(-1);
    }

    i = j = 0;

    fgets(string, SIZEOF_BUFFER, stdin);

    while (string[i] != '\0') {
        if (i % 2 == 0) {
                odd[j++] = string[i];
        }
        i++;
    }

    odd[j] = '\0';

    printf("Characters at odd position: %s\n",odd);

    // Don't forget to free allocated memory
    free(odd);
    free(string);

    return 0;
}

另外,不需要#include <stdio.h> #include <string.h> int main(){ char string[100],i,j; char odd[100]; i = j = 0; fgets(string, 100, stdin); while (string[i] != '\0') { if (i % 2 == 0) { odd[j++] = string[i]; } i++; } odd[j] = '\0'; printf("Characters at odd position: %s\n",odd); return 0; } =&gt; *string[strlen(*string) - 1] = '\0';在字符串

的末尾始终放置一个空字符

答案 2 :(得分:1)

这是[] vs *的优先级问题。见http://en.cppreference.com/w/c/language/operator_precedence。要解决它,请执行以下解释:

(*odd)[j] = '\0';

这也适用于声明;声明字符串作为指向100个字符数组的指针,将其更改为:

char (*string)[100];

您还必须分配内存。以下是包含所有这些更改的代码的更改版本:

#include <stdio.h>
#include <string.h>

int main(){
    char actualstring[100];
    char (*string)[100] = &actualstring, i = 0, j = 0;
    char actualodd[100];
    char (*odd)[100] = &actualodd;

    fgets(*string, 100, stdin);

    (*string)[strlen(*string) - 1] = '\0';

    while ((*string)[i] != '\0') {
        if (i % 2 == 0) {
                (*odd)[j++] = (*string)[i];
        }
        i++;
    }

    (*odd)[j] = '\0';

    printf("Characters at odd position: %s\n",*odd);

    return 0;
} 

您可能会发现将声明翻译为英语非常有用,反之亦然http://cdecl.org/

答案 3 :(得分:0)

string是一个指针数组。你没有初始化任何指针。但是你会通过这些指针写下来,好像他们指向某个地方一样。

您的代码是一个更复杂的版本:

char *ptr;
fgets(ptr, 100, stdin);

其中(希望)应该明白问题是什么。 odd也有类似的问题。