Note that there are some explanatory texts on larger screens.

plurals
  1. POfree(): invalid next size (fast) string too long?
    text
    copied!<p>My code is getting the following error:</p> <pre><code>free(): invalid next size (fast) </code></pre> <p>My code:</p> <pre><code> #include &lt;stdio.h&gt; #include &lt;string.h&gt; #include &lt;stdlib.h&gt; int main() { char *temp_str; char *pos, *pos2; char *key = (char*)malloc(20); char *data = (char*)malloc(20); const char newline = '\n'; char *unparsed_data = "NEW_DATA_PACKET\n\ Data Set 16-byte Universal Key\n\ Unix Time Stamp (microsecs): 1319639501097446\n\ Frame Number: 0\n\ Version: 3\n\ Platform Yaw Angle (deg): 15.22428\n\ Platform Pitch Angle (deg): 1.78528\n\ Platform Roll Angle (deg): 2.004111\n\ Image Source Source: test\n\ Image Coordinate System: Testing XXXXX\n\ Sample Latitude (deg): 17.306791\n\ Sample Longitude (deg): -60.26209\n\ Sample True Altitude (m): 7.623407\n\ Sample Horizontal FoV (deg): 0.1821277\n\ Sample Vertical FoV (deg): 15.1879\n\ Sample Rel. Azimuth Angle (deg): 291.70295\n\ Sample Rel. Elevation Angle (deg): -5.941163\n\ Sample Rel. Roll Angle (deg): 3.10959\n\ Checksum: 4659\n"; temp_str = (char*)malloc(strlen(unparsed_data)); printf("\nThe original string is: \n%s\n",unparsed_data); //Ignore the first two lines pos = strchr(unparsed_data, newline); strcpy(temp_str, pos+1); pos = strchr(temp_str, newline); strcpy(temp_str, pos+1); printf("STARTING THE PARSER\n\n"); while(strlen(temp_str) &gt; 2) { printf("\tstarting loop\n"); //Getting the position of the colon and newline character pos = strchr(temp_str, ':'); // ':' divides the name from the value pos2 = strchr(temp_str, '\n'); //end of the line realloc(key, (pos-temp_str-1)); //allocate enough memory realloc(data, (pos2-pos)-1); printf("After realloc \n"); //copying into key and data strncpy(key, temp_str, (pos-temp_str)); strncpy(data, pos + 2, (pos2-pos)-2); //Append null terminator strcpy(key+(pos-temp_str-1)+1, ""); strcpy(data+(pos2-pos)-2, ""); printf("%s = ",key); printf("%s\n",data); assign_value(key,data, &amp;gvals); printf("The value has been assigned\n"); strcpy(temp_str, pos2+1); printf("Freeing key and data\n\n"); free(key); free(data); } return 0; } </code></pre> <p>I am also getting some garbage when it is printing</p> <pre><code>STARTING THE PARSER starting loop After realloc Unix Time Stamp (m13196395 = 13196395 The value has been assigned Freeing key and data *** glibc detected *** ./memory_alloc: free(): invalid next size (fast): 0x098cd008 *** </code></pre> <p>Finally, when I reduce the length of the lines of the string, the code works perfectly. It works fine with the following string:</p> <pre><code>char *unparsed_data = "NEW_DATA_PACKET\n\ Data Set 16-byte Universal Key\n\ Time Stamp: 1319639501097446\n\ Frame Number: 0\n\ Version: 3\n\ Yaw Angle: 15.22428\n\ Pitch Angle: 0.78528\n\ Roll Angle: 2.004111\n\ Source: test\n\ Coor System: Test XXXXX\n\ Latitude: 27.306791\n\ Longitude: -60.26209\n\ True Altitude: 7.623407\n\ Hor FoV: 0.1821277\n\ Ver FoV: 15.1879\n\ Azimuth: 291.702954\n\ Elevation: -0.433563\n\ Roll: 0.79659\n\ Checksum: 2659\n"; </code></pre> <p>** <strong>*<em>Solution:</em>*</strong> **</p> <pre><code>int main() { char *temp_str; char *pos, *pos2; char *key = (char*)malloc(20); char *data = (char*)malloc(20); const char newline = '\n'; char *unparsed_data = "NEW_DATA_PACKET\n\ The UAS Datalink Local Data Set 16-byte Universal Key\n\ Time Stamp: 1319639501097446\n\ Frame Number: 0\n\ Version: 3\n\ Yaw Angle: 15.22428\n\ Pitch Angle: 0.78528\n\ Roll Angle: 2.004111\n\ Source: test\n\ Coor System: Test XXXXX\n\ Latitude: 27.306791\n\ Longitude: -60.26209\n\ True Altitude: 7.623407\n\ Hor FoV: 0.1821277\n\ Ver FoV: 15.1879\n\ Azimuth: 291.702954\n\ Elevation: -0.433563\n\ Roll: 0.79659\n\ Checksum: 2659\n"; temp_str = (char*)malloc(strlen(unparsed_data)); //Ignore the first two lines pos = strchr(unparsed_data, newline); strcpy(temp_str, pos+1); pos = strchr(temp_str, newline); strcpy(temp_str, pos+1); printf("STARTING THE PARSER\n\n"); while(strlen(temp_str) &gt; 2) { printf("\tstarting loop\n"); //Getting the position of the colon and newline character pos = strchr(temp_str, ':'); // ':' divides the name from the value pos2 = strchr(temp_str, '\n'); //end of the line char *new_key = (char*)realloc(key, (pos-temp_str+1)); //allocate enough memory char *new_data = (char*)realloc(data, (pos2-pos+1)); if(new_key) key = new_key; if(new_data) data = new_data; printf("After realloc \n"); //copying into key and data strncpy(key, temp_str, (pos-temp_str)); strncpy(data, pos + 2, (pos2-pos)-2); //Append null terminator memset(key + (pos-temp_str) , '\0', 1); memset(data + (pos2 - pos), '\0', 1); printf("%s = ",key); printf("%s\n",data); assign_value(key,data, &amp;gvals); printf("The value has been assigned\n"); strcpy(temp_str, pos2+1); printf("Freeing key and data\n\n"); free(key); key= NULL; free(data); data = NULL; } return 0; } </code></pre>
 

Querying!

 
Guidance

SQuiL has stopped working due to an internal error.

If you are curious you may find further information in the browser console, which is accessible through the devtools (F12).

Reload