предупреждение: присваивание делает целое число из указателя без приведения, ошибка сегментации - PullRequest
2 голосов
/ 12 марта 2012

Я начинаю с C, исходя из языка meta c, базового, короткого времени на PHP и HTML

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

compare(const void * a, const void * b){
    return ( *(int*)a - *(int*)b );
} 

int main(){

    int arr_size = 10;

    int j;

    char array[arr_size][2];
    char str[50];
    char output[50];

    // fill the array with string and random integers
    for (j=0; j<arr_size; j++) {
         strcpy(str, "array");
         array[j][0] = str;       //i've should put *str
         array[j][1] = rand() % arr_size+1;
    }

    // print the array
    for (j=0; j<arr_size; j++) {
        strcpy(str, "");
        strcpy(output, "");
        sprintf(str, "%u", array[j][0]); // %u should be %s but return me segmentation fault
        strcat(output, str);
        strcat(output, " ");
        sprintf(str, "%i", array[j][1]);

        strcat(output, str);
        printf(output); printf("\n");
    }

    printf("\n");

}

это полный код, посмотрите на

array[j][0] = str;

и

sprintf(str, "%u", array[j][0]);

Мне нужно поставить * перед str (*str), чтобы передать предупреждающее сообщение, но я не объявил ни одного указателя. почему это решение?

Если я изменю %u на %s, это возвращает мне ошибку сегментации, в чем проблема?

1 Ответ

0 голосов
/ 12 марта 2012

array[j][0] - это char. Вы не можете назначить ему массив символов. *str - это просто первый символ в str, поэтому это назначение действительно.

По той же причине вы не можете распечатать его с помощью %s - этот спецификатор используется для печати строк с нулевым символом в конце, а не одиночных символов.

Вы также не можете сделать sprintf(str, "%s", array[j]);, так как он не завершается нулем /

...