简体   繁体   中英

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

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

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

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. You can also increase the stack limit using setrlimit. in the code (but preferably not in the main function ).

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

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