c ядро ​​дампа программы на unix - PullRequest
1 голос
/ 21 октября 2011

Я новый изучающий язык C.

Ниже программа хорошо работает на Windows, но когда я компилирую с gcc на solaris, это дамп ядра

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

void main()
{
char *name;
name="James Bond";
int i=0;
sprintf(name,"%s/%d",name,i);
printf("String is %s",name);
}

Пожалуйста, предложите

Ответы [ 6 ]

6 голосов
/ 21 октября 2011

Вы не можете изменить строковый литерал таким образом, он не определен в соответствии со стандартом. Вы пытаетесь перезаписать этот строковый литерал другими данными (sprintf).

Многие реализации помещают их в постоянную память, вызывая дамп ядра - они хорошие. Плохие будут продолжаться, как будто все в порядке, чего обычно не бывает.

Вы можете попробовать следующее:

#include <stdio.h>

int main (void) {
    char *name;
    char name2[100];  // make sure plenty of space.
    name = "James Bond";
    int i = 0;
    sprintf (name2, "%s/%d", name, i);
    printf ("String is %s\n", name2);
    return 0;
}

Большинство вопросов этого типа имеют такой код:

name = "Bob";
*name = 'J';   // to try and make "Job"

но просто как неопределенный для записи в строковые литералы, используя также sprintf.


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

char *path = "/tmp/";
char *file = "xyz.txt"
char fullpath = malloc (strlen (path) + strlen (file) + 1);
if (fullpath == NULL)
    // error and exit condition
strcpy (fullpath, path);
strcat (fullpath, file);
// use fullpath for your nefarious purposes :-)
free (fullpath);

Это один способ сделать это, есть другие.

1 голос
/ 21 октября 2011

Правильный способ определения и инициализации константной строки в C:

char name[]="James Bond";

Ваш код может быть таким:

#include<stdio.h>
#include<stdlib.h>
void main()
{
    char name[] = "James Bond";
    int i = 0;

        printf("String is %s/%d", name,i);

}
1 голос
/ 21 октября 2011
char *name;
name="James Bond";   // name is pointing into read-only memory
int i=0;
sprintf(name,"%s/%d",name,i); // trying to write to read-only memory
printf("String is %s",name);

вместо этого используйте буфер

char name[32] = "James Bond";
...
0 голосов
/ 21 октября 2011

В Linux и системах с GNU Libc вы также можете кодировать, используя asprintf

char* str = NULL; // pointer should be initialized to NULL
asprintf (&str, "someformat %d", 20);

При использовании GTK вы также можете вызвать g_strdup_printf

.понять разницу и сходство между массивами и указателями в C. Во многих книгах или лекциях это подробно объясняется.

С уважением.

0 голосов
/ 21 октября 2011

Вам необходимо выделить память для указателя name, используя malloc / calloc или определив его как переменную фиксированной длины: char name[50] (например)

0 голосов
/ 21 октября 2011

Ваша строка "name" недостаточно длинна, чтобы вместить набор символов, которые вы печатаете на нее с помощью sprintf - вам нужно выделить достаточный буфер для всех символов.

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