2014-12-13 3 views
-2

Я пытаюсь использовать указатели для передачи массива строки в и обратно из функции или, в частности, инициализации массива строк в основной функции и используя другую функцию для определения указанного массива. Проблема в том, что я использую цикл for для привязки строки к индексу массива, а когда индекс больше 20 (и, в свою очередь, цикл for), он перестает отвечать. Он отлично работает, когда его меньше или равна 20.C - присвоение массива строк массиву из 21 или более аварий

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

#define MAX 21 
#define MAXA MAX+1 
#define SIZEAR 6 

void col(int *pgv,char **sizev,int *coffv,int *moffv,int *yoffv) { 
    for (int i=0;i<MAX;i++) { 
     int m=i%2; 
     //Size 
     if (m==0) 
      strcpy(sizev[i],"Small"); 
     else 
      strcpy(sizev[i],"Large"); 
    } 
} 

int main(void) { 
    int i,pg[MAXA],coff[MAXA],moff[MAXA],yoff[MAXA];//seen 

    char **size = (char**)malloc(MAXA*sizeof(char*)); 
    for(i=0;i<MAXA;i++) 
     size[i]=(char*)malloc(SIZEAR*sizeof(char)); 

    col(pg,size,coff,moff,yoff); 
    return 0; 
} 
+1

Что делать, если вы '#define MAXA (MAX + 1)'? –

+0

Всегда инициализируйте свои массивы (до нуля, если ничего больше), чтобы предотвратить случайную попытку доступа к неинициализированному элементу. например 'int pg [MAXA] = {0};' достаточно. Хотя это не требуется строго, это сэкономит вам печаль в долгосрочной перспективе. По той же причине подумайте об использовании 'calloc' вместо' malloc'. Он инициализирует все выделенное пространство 'zero/NULL'. –

+0

@ DavidC.Rankin: Это плохой совет. Если вы не делаете ложных инициализаций (которые компилятор не может оптимизировать, тем самым снижая производительность), большинство компиляторов во многих ситуациях смогут предупреждать о некорректном доступе. – Deduplicator

ответ

3
#define MAXA MAX+1 

Этот макрос является классическим провал из-за недостаточного количества скобок.
Смотрите, где он используется:

size[i]=(char*)malloc(SIZEAR*sizeof(char)); 

Что после того, как макро-расширения:

size[i]=(char*)malloc(MAX + 1*sizeof(char)); 

В качестве побочного сведению, sizeof(char) всегда 1.
Кроме того, Don't cast the result of malloc (and friends).

+0

О, так что я просто не обратил внимания. Достаточно справедливо: P, но со всей серьезностью спасибо, я был в тупике на протяжении многих дней .. – Cpaz

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