2013-06-20 2 views
0

Сложная строка: char longest[] Инициализация массива. Если я положил его так, как это (char longest[lim]), строка вернулась ко мне после того, как EOF длиннее lim, поэтому я предполагаю, что это не работает. Но если я явно помещаю 10 (char longest[10]) - он работает так, как я ожидаю, и возвращаю только 10 первых символов line.Как может быть, что переменная с десятичной привязкой к ней ведет себя не так, как это делает фактическое десятичное значение?

Что делает разницу, в этом точном случае между int lim = 10; char longest[lim] и char longest[10]

#include <stdio.h> 
#define MAXLINE 1000 //maximum input line size 
//#define LIM 10 

int getline(char line[], int maxline); 
void copy(char to[], char from[]); 

//print longest input line 
main() 
{ 
    int lim=10; 


    int len; //current line length 
    int max; //maximum length seen so far 
    char line[MAXLINE]; //current input line 
    char longest[lim]; //longest line saved here 

    max = 0; 
    while ((len = getline(line, MAXLINE)) > 0) 
    { 
     if (len > max) 
     { 
      max = len; 
      copy(longest, line); 
     } 
    } 
    if (max > 0) //there was a line 
    { 
     printf("Length: %d\n", max); 
     printf("First %d characters of line: %s", lim, longest); 
    } 
    return 0; 
} 

//getline: read a line into s, return length 
int getline(char s[], int lim) 
{ 
int c, i; 

for (i=0; i<lim-1 && (c=getchar())!=EOF && c!='\n'; ++i) 
{ 
    s[i] = c; 
} 
if (c == '\n') 
{ 
    s[i] = c; 
    ++i; 
} 
s[i] = '\0'; 
return i; 
} 

//copy: copy 'from' into 'to'; assume to is bigh enough 
void copy(char to[], char from[]) 
{ 
int i; 

i = 0; 
    while ((to[i] = from[i]) != '\0') 
    { 
     ++i; 
    } 
} 
+0

'int lim = 10; char array [lim]; 'уверен, что не K & R C! –

ответ

1

type name[10] фиксируется декларация массива.

type name[exp] - массив переменной длины.

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

Таким образом, поведение случая, такое как доступ к границам границ массива в коде, как пример, равно undefined.

0

Если вы пишете слишком длинное значение для массива, вы получите «неопределенное поведение». Все может случиться. У вас может произойти сбой программы, или она может сделать что-то не так, или может показаться, что она работает. Изменение чего-либо еще в вашей программе может изменить то, что происходит.

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

Краткая версия: Прежде чем писать строку в массив, вы ДОЛЖНЫ убедиться, что она подойдет.