Странная ошибка sprintf в C - PullRequest
       0

Странная ошибка sprintf в C

3 голосов
/ 18 августа 2010

Я вызываю функцию, которая разветвляет и выполняет код другого процесса для меня.Есть несколько процессов, обозначенных как B, C и D. У меня есть практически идентичный код для создания различных процессов.По какой-то странной причине, которую я не могу раскрыть, одна из функций создания процесса вызывает ошибку сегментации.Они выглядят одинаково для меня.Любой шанс, что кто-то может взвесить, может быть, дать мне некоторое представление о том, в чем проблема?

void spawn_process_b(int fileID[]){
    int pid;
    char * argv[2];

    sprintf(argv[0], "%d", fileID[0]);
    sprintf(argv[1], "%d", fileID[1]);

    pid = fork();

    if (pid == 0)
    {
       execv("PipeW1", argv);
    }
}

void spawn_process_c(int fileID[]){
    int pid;
    char * argv[2];

    sprintf(argv[0], "%d", fileID[0]);
    sprintf(argv[1], "%d", fileID[1]);

    pid = fork();

    if (pid == 0)
    {
       execv("PipeW2", argv);
    }
}

Через установку точек останова cout << "bp1" << endl;и так далее, я обнаружил, что spawn_process_b будет работать очень хорошо.spawn_process_c войдет, но получит segfault при первой инструкции sprintf.У кого-нибудь есть идеи?Первоначально spawn_process_b доставлял мне неприятности, и ... моя рука Богу ... Я ничего не изменил, и он начал работать.Мне почти интересно, может ли это зависеть от окружающей среды? </p>

Ответы [ 3 ]

9 голосов
/ 18 августа 2010

argv[0] - это неопределенный указатель на отсутствие выделенного хранилища при sprintf подключении к нему.

Когда все сработало, это было случайно, когда память, которую вы набросали, просто оказалась в вашем рабочем пространстве.

В объявлении auto для argv выделено место для двух char * указателей. Указатели, скорее всего, заполнены мусором (то есть они указывают на случайные местоположения), и нет места, выделенного для хранения в них символов.

Вам нужно что-то вроде

char *argv[3];
for (int i = 0; i < 2; i++)
    argv[i] = malloc(space enough for my integer);
argv[2] = 0;

Где эта последняя строка важна для execv

4 голосов
/ 18 августа 2010

Вам просто повезло, что одна из функций действительно сработала. То, что вы делаете, это неопределенное поведение в обоих случаях, потому что вы не выделили память для строк, в которые вы печатаете.

char *argv[2] объявляет только массив из 2 символьных указателей, но они нигде не указывают. Вам нужно выделить для них память, прежде чем вы сможете их использовать, либо статически, например:

char argv[2][100]; // 2 strings of 100 characters each

или динамически, как это:

char *argv[2];
int i;
for (i = 0; i < 2; i++)
  argv[i] = (char *)malloc(100 * sizeof(char)); // 100 characters
1 голос
/ 18 августа 2010

Ваши argv[0] и argv[1] указатели на символы должны указывать на что-то и инициализироваться.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...