2014-05-30 4 views
-1

Я использую strtok_s с выделенной строкой.Почему strtok_s работает, когда я использую StrDup?

Код выше обрабатывает исключение:

char *string1 = NULL; 
string1 = (char*)LocalAlloc(LPTR, 100 * sizeof(char)); 
// TODO: Verify if string1 != NULL 
string1 = "A string\tof ,,tokens\nand some more tokens"; 
token1 = strtok_s(cp1, seps, &next_token1); 

Но когда я называю StrDup, мой код работает:

cp1 = StrDup(string1); 
token1 = strtok_s(cp1, seps, &next_token1); 

Однако мое понимание StrDup он использует LocalAlloc выделить дисковое пространство для копия строки (согласно MSDN).

Итак, что не так в моем первом примере? Как исправить этот код без использования StrDup?

+0

что LocalAlloc? – quantdev

+1

Я думаю, что вы просачиваете память. Вы потеряли указатель, возвращенный LocalAlloc. – Mabus

+0

О, боже мой, это ошибка новобранец ... Меня это беспокоило, когда я написал этот вопрос. Спасибо за ответы. – igloo42

ответ

2
string1 = (char*)LocalAlloc(LPTR, 100 * sizeof(char)); 
// TODO: Verify if string1 != NULL 
string1 = "A string\tof ,,tokens\nand some more tokens"; 
token1 = strtok_s(cp1, seps, &next_token1); 

Вы перезаписаны указатель ... он начинает NULL, и вы, чтобы она указывала на выделенное пространство (что ваше намерение), но затем изменить его, чтобы указать, что только для чтения к чему-то, ac string constant. Поскольку strtok_s должен иметь возможность записывать в буфер, это приводит к сбою. Вместо этого вместо strdup() вы создаете другую (записываемую) копию строки.

Вместо того, чтобы устанавливать string1 = "some constant string";, вы можете использовать strcpy() (одна из его версий, ограничивающих длину, для обеспечения безопасности), чтобы скопировать постоянную строку только для чтения в буфер. Это дает вам, где вам нужно быть без strdup(), но так как strdup() выполняет выделение для вас, ваша работа будет проще, если вы перейдете к ней напрямую и вырезаете выделение/копию.

1

Эта линия

string1 = "A string\tof ,,tokens\nand some more tokens"; 

не делать то, что вы ожидали.

Вы хотите записать содержимое постоянной строки в буфер памяти, на который указывает string1. Фактически вы сделали изменение значения string1, чтобы указать на память, выделенную компилятором для хранения постоянной строки.

Один из способов сделать то, что вы хотите это

strcpy(string1, "A string\tof ,,tokens\nand some more tokens"); 
Смежные вопросы