Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/linux/27.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C 程序仅在声明整数时工作_C_Linux_Gcc - Fatal编程技术网

C 程序仅在声明整数时工作

C 程序仅在声明整数时工作,c,linux,gcc,C,Linux,Gcc,我实际上是在尝试一些C编程代码,我想出了这个程序,出于某种原因,它只在声明了一个整数并给出了一些值时才起作用 下面的代码工作得很好 #include<stdio.h> int main() { FILE *file = fopen("/proc/cpuinfo","r"); char *line; int count = 0; if(file!=NULL) { while(fscanf(file," %[^\n]",lin

我实际上是在尝试一些C编程代码,我想出了这个程序,出于某种原因,它只在声明了一个整数并给出了一些值时才起作用

下面的代码工作得很好

#include<stdio.h>

int main()
{


    FILE *file = fopen("/proc/cpuinfo","r");
    char *line;
    int count = 0;
    if(file!=NULL)
    {
        while(fscanf(file," %[^\n]",line)!=-1)
        {
            printf("\n%s",line);
        }
        printf("\n\n\t* * * * * * * * * * * * * * * * * * * * * \n\n");
    }
    else
    {
        printf("\nFile Does not Exist\n");
    }
    return 0;
}
#包括
int main()
{
FILE*FILE=fopen(“/proc/cpuinfo”,“r”);
字符*行;
整数计数=0;
如果(文件!=NULL)
{
while(fscanf(文件“%[^\n]”,第行)!=-1)
{
printf(“\n%s”,第行);
}
printf(“\n\n\t*********\n\n”);
}
其他的
{
printf(“\n文件不存在\n”);
}
返回0;
}
但这不起作用,(我的意思是,当我运行它时,我会得到一个(null)值的无限循环

#包括
int main()
{
FILE*FILE=fopen(“/proc/cpuinfo”,“r”);
字符*行;
如果(文件!=NULL)
{
while(fscanf(文件“%[^\n]”,第行)!=-1)
{
printf(“\n%s”,第行);
}
printf(“\n\n\t*********\n\n”);
}
其他的
{
printf(“\n文件不存在\n”);
}
返回0;
}
我正在使用gcc编译器

gcc-v

使用内置规范。收集\u GCC=GCC COLLECT_LTO_WRAPPER=/usr/lib/gcc/x86_64-linux-gnu/4.6/LTO-WRAPPER 目标:x86_64-linux-gnu配置为:../src/configure-v --使用pkgversion='Ubuntu/Linaro 4.6.3-1ubuntu5'——使用bugurl=file:///usr/share/doc/gcc-4.6/README.Bugs ——启用语言= C、C++、FORTRAN、Objc、Obj-C++ +前缀=/US--程序后缀=-4.6——启用共享-启用链接器构建ID——使用系统ZLIB——LBEXECUDIR==/UR/LIB——不包含GETTEXT——启用线程= POSIX——GXX包括DR= /UR/INclude/c++/4.6--libdir=/usr/lib--enable nls--with sysroot=/--enable clocale=gnu--enable libstdcxx debug--enable libstdcxx time=yes--enable gnu unique object--enable plugin--enable objc gc disable werror--with-arch-32=i686--with tune=generic--enable checking=release--build x86_64-linux-gnu--host=x86_64-linux-gnu线程模型:posix gcc版本4.6.3(Ubuntu/Linaro 4.6.3-1ubuntu5)


谁能解释一下这里发生了什么,我想知道为什么会发生这种情况。

您没有为
缓冲区分配内存,在您的情况下,它只是一个无效指针

在第一种情况下,您(不)幸运,因为指针指向一个可写区域(特别是,您正在覆盖
count
所在的内存区域),但在第二种情况下,会出现分段错误

替换:

char *line; // Pointer to... somewhere?
与:

或任何其他合适的缓冲区大小。如果您需要一个不适合堆栈的缓冲区,则将其声明为全局变量(强烈反对,除非您的应用程序非常小或您知道自己在做什么),或在堆上分配它,方法是:

char *line = malloc(4096 * 1024);

当不再需要缓冲区时(例如,在终止程序之前),请记住调用
空闲(行)

您没有为
缓冲区分配内存,在您的情况下,它只是一个无效指针

在第一种情况下,您(不)幸运,因为指针指向一个可写区域(特别是,您正在覆盖
count
所在的内存区域),但在第二种情况下,会出现分段错误

替换:

char *line; // Pointer to... somewhere?
与:

或任何其他合适的缓冲区大小。如果您需要一个不适合堆栈的缓冲区,则将其声明为全局变量(强烈反对,除非您的应用程序非常小或您知道自己在做什么),或在堆上分配它,方法是:

char *line = malloc(4096 * 1024);

当不再需要缓冲区时(例如,在终止程序之前),请记住调用
free(line)
可能添加额外的int会导致内存布局略有不同,因此会以不同的方式中断

char *line;
应该是

char line[1024];
并添加一个fclose

由于注释而编辑:
如果需要第一个定义和malloc/free:

char *line;
line = malloc(1024);
...
free(line);
应该是

char line[1024];
并添加一个fclose

由于注释而编辑:
如果需要第一个定义和malloc/free:

char *line;
line = malloc(1024);
...
free(line);

更好的是,至少在Linux上,您可以使用

然而,在实践中,我们都知道
/proc/cpuinfo
包含一些长的行(对于
标志而言,尤其是
),但最长的行可能小于例如512字节(在我的i3770K Linux 3.13内核上,它有483字节)您可以简单地使用

注意,应在某些
输入操作(此处
fgets
)之后(而不是之前)使用


注意:不要忘记使用所有警告和调试信息进行编译(例如,
gcc-Wall-g
),并使用调试器(
gdb
)。

更好的是,至少在Linux上,您可以使用

然而,在实践中,我们都知道
/proc/cpuinfo
包含一些长的行(对于
标志而言,尤其是
),但最长的行可能小于例如512字节(在我的i3770K Linux 3.13内核上,它有483字节)您可以简单地使用

注意,应在某些
输入操作(此处
fgets
)之后(而不是之前)使用


注意:不要忘记使用所有警告和调试信息(例如,
gcc-Wall-g
)进行编译,并使用调试器(
gdb
)。

“不工作”意味着…?我得到一个无限循环的(null)s。您正在访问一个不允许的