简体   繁体   English

memcpy()给我段错误

[英]memcpy() giving me seg faults

My program which is an OpenGL program compiles and runs fine when i dont use memcopy, but when this function is used in the program it gives me a seg fault when i try to run the program after compilation, it still compiles in both cases but gives me the seg fault when i compile the program with this function, and the seg fault when checked in gdb does not show memcpy as the problem but an initialization function init() which creates the opengl context for me, but the weird thing is that it only happens when i include memcpy in the program and compile it, otherwise init() works fine , i also tested it in another file to confirm that it works on its own 当我不使用memcopy时,我的程序是OpenGL程序,可以编译并运行良好,但是当我在程序中使用此函数时,如果在编译后尝试运行该程序,则会出现段错误,但在两种情况下仍可以编译,但是当我使用此函数编译程序时,出现seg错误,而在gdb中检查时出现的seg错误并未将memcpy显示为问题,而是为我创建了opengl上下文的初始化函数init(),但奇怪的是,它仅当我在程序中包含memcpy并对其进行编译时才会发生,否则init()可以正常工作,我还在另一个文件中对其进行了测试,以确认它自己可以工作

I dont know why it is doing it, i did notice that this has happened since linux mint upgraded some packages, the program worked fine before the upgrade 我不知道为什么要这么做,我确实注意到这是自linux mint升级了某些软件包以来发生的,该程序在升级之前运行良好

here is the program source code 这是程序源代码

#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <X11/Xlib.h>
#include <X11/Xutil.h>
#include <GL/glew.h>
#include <GL/glx.h>

#include <time.h>
#include <math.h>

#include "glx2.c"
#include "renderBuffer.h"
#include "new.hpp"

#define WIDTH 1080 
#define HEIGHT 720

int main(){

   init(WIDTH,HEIGHT);
   createShaders();

   char name[1][25];

   float returned[720][1080][2] = {0.0f};


   strcpy(name[0],"ryu2.bmp");

   GLuint frameBuffer = createFramebuffer(frameBuffer);

   GLuint renderTexture = createRenderTexture(renderTexture, WIDTH,HEIGHT);
   //GLuint depth_texture;

   //glGenTextures(1, &depth_texture);
   //glBindTexture(GL_TEXTURE_2D, depth_texture);
   //glTexStorage2D(GL_TEXTURE_2D, 1, GL_DEPTH_COMPONENT32F, 1080, 720);

   //glFramebufferTexture(GL_FRAMEBUFFER,GL_DEPTH_ATTACHMENT,depth_texture, 0);

   glFramebufferTexture(GL_FRAMEBUFFER,GL_COLOR_ATTACHMENT0,renderTexture,0);

   static const GLenum draw_buffers[] = { GL_COLOR_ATTACHMENT0 };
   glDrawBuffers(1, draw_buffers);


   //bind framebuffer 
   glBindFramebuffer(GL_FRAMEBUFFER,frameBuffer);
   checkFramebuffer();

   GLfloat vertices[] = { 

   //   
   //  X      Y                  U            V
   //triangle 1
     -1.0,       -1.0,          0.0,         0.0,
     -22.0/27.0, -1.0,          100.0/800.0, 0.0,
     -1.0,       -41.0/60.0,    0.0,         114.0/342.0,
     -22.0/27.0, -41.0/60.0,    100.0/800.0, 114.0/342.0};   


   GLuint vao1 = createVao();
   GLuint vbo1 = createVbo();

   glBufferData(GL_ARRAY_BUFFER, sizeof(vertices), vertices, GL_STATIC_DRAW);  

   GLuint tex = createTexture(name[0]);

   //set up data format in opengl and save in vao
   glVertexAttribPointer(0, 2, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat), 0);
   glEnableVertexAttribArray(0);

   glVertexAttribPointer(1, 2, GL_FLOAT, GL_FALSE, 4*sizeof(GLfloat), (const GLvoid*)(2 * sizeof(GLfloat)));
   glEnableVertexAttribArray(1);


   bindObject(vao1, tex);

   glBindFramebuffer(GL_FRAMEBUFFER, frameBuffer);
   glViewport(0,0, WIDTH,HEIGHT);

   glDrawArrays(GL_TRIANGLE_STRIP, 0, 4);

   //////completed drawing to framebuffer original values 

   glBindFramebuffer(GL_FRAMEBUFFER,0);

   glBindTexture(GL_TEXTURE_2D, renderTexture);

   glGetTexImage(GL_TEXTURE_2D, 0,GL_RG,GL_FLOAT,(void *)&returned);

   float another[720][1080][2];

   memcpy((void *)another, (const void *)returned, sizeof(returned));
   //----------------------completed copying original values to array for all comparison

   int i = 0,j=0;

   //for(j=0; j<114;j++)
   //   for(i=0; i<100;i++){   
         //printf("%f %f\n",another[j][i][0], another[j][i][1]);
   //}



   //from this point on there will be change and comparison

   //GLuint disp = glGetUniformLocation(shader_program, "disp");

   //glUniform2f(disp, 1.0/540,1.0/360);




   glXMakeCurrent( dpy, 0, 0 );
   glXDestroyContext( dpy, ctx );
   glXDestroyWindow(dpy, glxWin);
   XDestroyWindow( dpy, win );
   XFreeColormap( dpy, cmap );
   XCloseDisplay( dpy );

    return 0;

}

when i run gdb this is the problem it gives , despite that when i comment out memcpy it works fine and doesnt give me any seg faults 当我运行gdb时,这是它带来的问题,尽管当我注释掉memcpy时,它仍然可以正常工作并且不会给我任何段错误

Program received signal SIGSEGV, Segmentation fault.
0x0000000000402876 in main () at untitled.cpp:22
22     init(WIDTH,HEIGHT);
(gdb) 

@BarmakShemirani指出的答案是linux的堆栈限制为8mb,并且由于两个数组的总和超过12mb,因此将覆盖堆栈,因此为什么对我来说出现了问题,解决方案是写入/分配给用malloc()代替

@BarmakShemirani is correct about the stack limit. @BarmakShemirani关于堆栈限制是正确的。 You can also increase the stack limit using setrlimit. 您也可以使用setrlimit增加堆栈限制 in the code (but preferably not in the main function ). 在代码中(但最好不在main函数中 )。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM