2016-12-23 2 views
0

Так я это код, который я сводились поэтому его единственной целью является показать меня проблема:Почему я получаю предупреждение «int-conversion», когда я назначаю значение члену массива строк в инициализаторе структуры?

typedef struct _TEST {char strarr[3][20];} TEST; 

int main(int argc, char *argv[]) { 
    char strarr[3][20] = {"some", "test", "strings"}; 
    TEST test = {.strarr=strarr}; 

    return 0; 
} 

Когда я пытаюсь скомпилировать я получаю это предупреждение:

$ gcc test.c -o test 
test.c: In function ‘main’: 
test.c:6:26: warning: initialization makes integer from pointer without a 
cast [-Wint-conversion] 
    TEST test = {.strarr=strarr}; 
         ^
test.c:6:26: note: (near initialization for ‘test.strarr[0][0]’) 

Я пробовал приходить в сообщение об ошибке, но результаты, которые я получаю, это все люди, которые неправильно используют указатели. Я не думаю, что неправильно использую указатели. Я не думаю, что на самом деле я даже использую указатели в этом коде, но я довольно новичок в C, и все еще есть много вещей, которые я действительно не понимаю (как они работают или почему они так неинтуитивны) , Особенно со струнами.

Я также пробовал разыгрывать различные фразы по строкам «присваивание строкового массива в инициализаторе структуры», но ни один из результатов, которые я нашел, не имеет отношения к моей проблеме.

I did find something maybe relevant when I searched "near initialization for." Хотя это не относится к моей проблеме, я нашел полезную информацию: они получили предупреждение, потому что они неправильно инициализировали переменную. Но я не знаю, что я делаю неправильно.

+7

Я думаю, что настоящий вопрос заключается в том, почему это вообще компилируется для вас. 'char [3] [20] strarr;' недействителен C, и все версии gcc я могу найти прямо сейчас на нем ошибку, как и следовало ожидать. Правильной декларацией C будет 'char strarr [3] [20];'. Вы действительно уверены, что код, который вы опубликовали, - это точный код, который вы компилируете? – Dolda2000

+0

Поскольку правая сторона 'strarr' рассматривается как указатель, такая инициализация невозможна. Вместо этого используйте 'memcpy'. – BLUEPIXY

+0

или 'TEST test; test = * (TEST *) strarr; ' – BLUEPIXY

ответ

1

Потому что strarr это массив, который вы не можете написать .strarr = strarr. Потому что массив не назначается. Так вы могли бы сделать:

test_s test = { 
    .strarr = {{strarr[0][0], 
       strarr[0][1] /* to strarr[0][x], x is the end of the string '\0' */}, 
       {0 /* same for strarr[1] */}, 
       {0 /* strarr[2] */}}}; 

но это действительно больно. Таким образом, вы можете использовать вместо memcpy():

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

typedef struct 
{ 
    char strarr[3][20]; 
} test_s; 

int main(void) 
{ 
    char strarr[3][20] = {"some", "test", "strings"}; 

    test_s test; 
    memcpy(test.strarr, strarr, sizeof test.strarr); 

    for (size_t i = 0; i < sizeof strarr/sizeof *strarr; i++) { 
     printf("%s\n", test.strarr[i]); 
    } 
} 

Или использовать указатель указателя. Так test будет действительна только в том случае strarr действует тоже:

#include <stddef.h> 
#include <stdio.h> 

typedef struct 
{ 
    char **strarr; 
} test_s; 

int main(void) 
{ 
    char *strarr[] = {"some", "test", "strings"}; 

    test_s test = {.strarr = strarr}; 

    for (size_t i = 0; i < sizeof strarr/sizeof *strarr; i++) { 
     printf("%s\n", test.strarr[i]); 
    } 
} 

Или снова использовать указатель указателя, но выделить память так test может жить без strarr:

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

typedef struct 
{ 
    char **strarr; 
} test_s; 

int main(void) 
{ 
    char *strarr[] = {"some", "test", "strings"}; 
    size_t const size_strarr = sizeof strarr/sizeof *strarr; 

    test_s test = {.strarr = malloc(sizeof *test.strarr * size_strarr)}; 
    if (test.strarr == NULL) { 
     return 1; 
    } 

    for (size_t i = 0; i < size_strarr; i++) { 
     test.strarr[i] = malloc(sizeof *test.strarr[i] * (strlen(strarr[i]) + 1)); 
     if (test.strarr[i] == NULL) { 
      return 1; 
     } 
     strcpy(test.strarr[i], strarr[i]); 

     printf("%s\n", test.strarr[i]); 
    } 
} 

Узнать больше о array.

+1

Большое вам спасибо, я не знал о назначаемых массивах. может быть, мне нужно еще немного почитать на c, прежде чем пытаться развиваться. –

+0

также есть ли какие-либо стандарты стиля для c? как и для структур, я видел все кепки, но мне вообще не нравятся все кепки, и я бы подумал использовать случай с капиталом, но, вероятно, это было бы нехорошо для путаницы с классами –

+1

@JosieThompson struct no need convention потому что вы должны написать 'struct name'. Но вы можете сделать 'name_s', если хотите. Это нормально использовать условное обозначение класса 'struct Name'. – Stargateur

Смежные вопросы