0

これを実行すると、セグメンテーション違反が発生しますか??

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

static char* exe;

void usage(void) {
    printf("Usage: %s <number of integers>\n", exe);
}

int main(int argc, char** argv) {
    //This program reads in n integers and outputs them/
    //in reverse order. However, for some odd reason, I/
    //am getting an error when I run it with no command/
    //line arguments. It is supposed to display helpful/
    //usage information out, but instead it segfaults??/
    exe = malloc(50 * sizeof(*exe));
    strncpy(exe, argv[0], 49);

    if(argc != 2) {
        usage();
        exit(0);
    }

    int n = atoi(argv[1]);
    int* numbers = malloc(n * sizeof(*numbers));

    int i;
    for(i = 0; i < n; i++) {
        scanf("%d\n", &numbers[i]);
    }

    for(i = 9; i >= 0; i--) {
        printf("%d:\t%d\n", 10 - i, numbers[i]);
    }

    free(numbers);
    free(exe);
    return 0;
}
4

3 に答える 3

0

この変数argv[0]は、実行中のプログラムの名前へのポインターを保持します。あなたのプログラムは、このポインタから始まる 49 文字または NULL のどちらか早い方を読み取ろうとしています。あなたの場合、アクセス権のない新しいページに移動しようとしている可能性があります。

于 2013-05-23T00:34:17.377 に答える
0

exe文字列の後に NULL ターミネータがあることを確認する必要がありますstrncpy

の後に次の行を追加してみてくださいstrncpy:

    exe[49] = '\0';
于 2013-05-23T00:35:55.693 に答える