C++不允许使用可变大小的数组。

21

我正在使用别人编写的一些现有代码,但我无法将其编译(我的C经验有限,但我正在努力学习!)。

utilities.cc

#include "utilities.h"
FILE *open_file(char *filename, const char*extension, const char *access)
{
  char string[MAX_STR_LEN];
  FILE *strm = NULL;

  if(filename[0]=='\0')
   {
      printf("\n INPUT FILENAME (%s) > ",access);
      fgets(string,MAX_STR_LEN,stdin);
      sscanf(string,"%s",filename);
      printf(" FILE %s opened \n", filename);
   }
   int len=strlen(filename);

   if( len + strlen(extension) >= MAX_STR_LEN)
   {
      printf("\n ERROR: String Length  of %s.%s Exceeds Maximum",
              filename, extension);
      return(NULL);
   } 

   // char *filename1 = new(char[len+strlen(extension)+1]);

   const int filenameLength = len+strlen(extension)+1;
   char *filename1 = new(char[filenameLength]);

   strcpy(filename1,filename); // temp filename for appending extension

   /* check if file name has .extension    */
   /* if it does not, add .extension to it */
   int i=len-1;
   while(i > 0 && filename[i--] != '.');
   //   printf("\n Comparing %s to %s", extension, filename+i+1);
   if(strcmp(extension, filename+i+1)  )
      strcat(filename1,extension);
   if( (strm = fopen(filename1, access) ) == NULL )
   {
      printf("\n ERROR OPENING FILE %s (mode %s)", filename1,access);
   }
   delete(filename1);
   return(strm);
}

这里是错误信息。

Compiling utilities.cc ...
src/utilities.cc: In function ‘FILE* open_file(char*, const char*, const char*)’:
src/utilities.cc:251: error: ISO C++ forbids variable-size array
gmake: *** [/home/landon/geant4/work/tmp/Linux-g++/exampleN01/utilities.o] Error 1

第251行的错误是指

char *filename1 = new(char[filenameLength]);

如果您需要任何其他信息,请告诉我。


1
你是否传递了 -Werror 选项,将警告视为错误?g++ 允许使用可变长度数组作为扩展。 - Jesse Good
5
确实,这是C语言,不是C++。你只是在使用C++编译器。 - Ed S.
4
C语言何时引入了“new”和“delete”关键字? - DavidO
3个回答

33

这个错误是正确的。在C++中,变长数组(VLA)是被禁止的。这就是一个VLA:

char filename1char[filenameLength];

你可能意思是这样:

char *filename1 = new char[filenameLength];

这不是一个变长数组(VLA),而是在堆上分配的char数组。请注意,您应该使用delete[]运算符删除此指针:

delete[] filename1;

1
我应该将 delete(filename1) 替换为 delete[] filename1 吗? - user1509364
4
@user1509364,delete 你所 new 的内容,delete[] 你所 new[] 的内容。 - chris

17

可以尝试这个方法

    char *filename1 = new char[filenameLength];

你不能像这样在栈上创建一个局部变量长度数组

    char filename1[filenamelength];

除非将 filenamelength 声明为 const,否则应该避免修改它。

另外,由于您已经为数组分配了内存,您应该使用

   delete [] filename1;
否则将会导致内存泄漏。在您的return值周围加上括号不是必要的;

3

虽然它们被禁止,但是可以使用堆栈分配器来解决问题,例如:

http://howardhinnant.github.io/stack_alloc.html

您可以将堆栈分配器与::std::vector(或其他一些容器,或直接使用)一起使用,这样就得到了一个VLA


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接